<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"><title>十、Java并发系列之 Java 并发编程面试题 | 云少IT</title><meta name="keywords" content="Java并发系列之 Java 并发编程面试题"><meta name="author" content="云少"><meta name="copyright" content="云少"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="mobile-web-app-capable" content="yes"><meta name="apple-touch-fullscreen" content="yes"><meta name="apple-mobile-web-app-title" content="十、Java并发系列之 Java 并发编程面试题"><meta name="application-name" content="十、Java并发系列之 Java 并发编程面试题"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="#ffffff"><meta property="og:type" content="article"><meta property="og:title" content="十、Java并发系列之 Java 并发编程面试题"><meta property="og:url" content="https://it985.github.io/posts/774c589b.html"><meta property="og:site_name" content="云少IT"><meta property="og:description" content="十、Java并发系列之 Java 并发编程面试题 master ，这是我的小站,欢迎访问哦~~  应聘 Java 岗，总是免不了几个 Java 并发编程的面试题，不过大多数都局限在 java.util.concurrent 包下的知识和实现问题。本文针对 Java 并发相关的常见的面试题做一些解释。"><meta property="og:locale" content="zh-CN"><meta property="og:image" content="https://cn.bing.com/th?id=OHR.ShikisaiBiei_EN-US4615475287_UHD.jpg"><meta property="article:author" content="云少"><meta property="article:tag" content="云少IT,IT,技术,分享,程序员,博客,教程,工具,框架,bug,java,spring,数据库,"><meta name="twitter:card" content="summary"><meta name="twitter:image" content="https://cn.bing.com/th?id=OHR.ShikisaiBiei_EN-US4615475287_UHD.jpg"><meta name="description" content="十、Java并发系列之 Java 并发编程面试题 master ，这是我的小站,欢迎访问哦~~  应聘 Java 岗，总是免不了几个 Java 并发编程的面试题，不过大多数都局限在 java.util.concurrent 包下的知识和实现问题。本文针对 Java 并发相关的常见的面试题做一些解释。"><link rel="shortcut icon" href="/img/logo.webp"><link rel="canonical" href="https://it985.github.io/posts/774c589b"><link rel="preconnect" href="//npm.elemecdn.com"><link rel="preconnect" href="//npm.onmicrosoft.cn"><link rel="preconnect" href="//www.google-analytics.com" crossorigin=""><link rel="preconnect" href="//busuanzi.ibruce.info"><meta name="google-site-verification" content="NuBZ4r-QCqSgo4XUScdEsQW0bolIHEiVGq4A16ndPQA"><meta name="baidu-site-verification" content="code-xxx"><meta name="msvalidate.01" content="xxx"><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.cbd.int/@fortawesome/fontawesome-free@6.4.0/css/all.min.css" media="print" onload='this.media="all"'><link rel="stylesheet" href="https://cdn.cbd.int/node-snackbar@0.1.16/dist/snackbar.min.css" media="print" onload='this.media="all"'><link rel="stylesheet" href="https://cdn.cbd.int/@fancyapps/ui@5.0.20/dist/fancybox/fancybox.css" media="print" onload='this.media="all"'><link rel="stylesheet" href="https://npm.elemecdn.com/anzhiyu-theme-static@1.0.0/swiper/swiper.min.css" media="print" onload='this.media="all"'><script async src="https://www.googletagmanager.com/gtag/js?id=G-3VMKW5TZBM"></script><script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-3VMKW5TZBM")</script><script>const GLOBAL_CONFIG={linkPageTop:{enable:!0,title:"与数百名博主无限进步",addFriendPlaceholder:"昵称（请勿包含博客等字样）：\n网站地址（要求博客地址，请勿提交个人主页）：\n头像图片url（请提供尽可能清晰的图片，我会上传到我自己的图床）：\n描述：\n站点截图（可选）：\n"},peoplecanvas:void 0,postHeadAiDescription:{enable:!0,gptName:"云AI",mode:"tianli",switchBtn:!1,btnLink:"https://afdian.net/item/886a79d4db6711eda42a52540025c377",randomNum:3,basicWordCount:1e3,key:"48580d1e3f53ae174a1e",Referer:"https://blog.tryrun.top"},diytitle:{enable:!0,leaveTitle:"w(ﾟДﾟ)w 不要走！再看看嘛！",backTitle:"♪(^∇^*)欢迎肥来！"},LA51:{enable:!0,ck:"JiFOrFoQklEn9YLS",LingQueMonitorID:"JiqlTmdeI4e1fPbd"},greetingBox:{enable:!0,default:"晚上好👋",list:[{greeting:"晚安😴",startTime:0,endTime:5},{greeting:"早上好鸭👋, 祝你一天好心情！",startTime:6,endTime:9},{greeting:"上午好👋, 状态很好，鼓励一下～",startTime:10,endTime:10},{greeting:"11点多啦, 在坚持一下就吃饭啦～",startTime:11,endTime:11},{greeting:"午安👋, 宝贝",startTime:12,endTime:14},{greeting:"🌈充实的一天辛苦啦！",startTime:14,endTime:18},{greeting:"19点喽, 奖励一顿丰盛的大餐吧🍔。",startTime:19,endTime:19},{greeting:"晚上好👋, 在属于自己的时间好好放松😌~",startTime:20,endTime:24}]},twikooEnvId:"https://twikoo.tryrun.top/",commentBarrageConfig:void 0,root:"/",preloader:{source:2},friends_vue_info:{apiurl:"https://friends.tryrun.top/"},navMusic:!1,mainTone:void 0,authorStatus:{skills:["🤖️ 数码科技爱好者","🔍 分享与热心帮助","🏠 智能家居小能手","🔨 设计开发一条龙","🤝 专修交互与设计","🏃 脚踏实地行动派","🧱 团队小组发动机","💢 壮汉人狠话不多"]},algolia:{appId:"T5VW6VDYLS",apiKey:"227bcb041816af13cb1698db15a8ac89",indexName:"hexo-blog",hits:{per_page:6},languages:{input_placeholder:"输入关键词后按下回车查找",hits_empty:"找不到您查询的内容：${query}",hits_stats:"找到 ${hits} 条结果，用时 ${time} 毫秒"}},localSearch:void 0,translate:{defaultEncoding:2,translateDelay:0,msgToTraditionalChinese:"繁",msgToSimplifiedChinese:"简",rightMenuMsgToTraditionalChinese:"转为繁体",rightMenuMsgToSimplifiedChinese:"转为简体"},noticeOutdate:{limitDay:365,position:"top",messagePrev:"It has been",messageNext:"days since the last update, the content of the article may be outdated."},highlight:{plugin:"highlighjs",highlightCopy:!0,highlightLang:!0,highlightHeightLimit:330},copy:{success:"复制成功",error:"复制错误",noSupport:"浏览器不支持"},relativeDate:{homepage:!0,simplehomepage:!1,post:!0},runtime:"天",date_suffix:{just:"刚刚",min:"分钟前",hour:"小时前",day:"天前",month:"个月前"},copyright:void 0,lightbox:"fancybox",Snackbar:{chs_to_cht:"你已切换为繁体",cht_to_chs:"你已切换为简体",day_to_night:"你已切换为深色模式",night_to_day:"你已切换为浅色模式",bgLight:"#425AEF",bgDark:"#1f1f1f",position:"top-center"},source:{justifiedGallery:{js:"https://cdn.cbd.int/flickr-justified-gallery@2.1.2/dist/fjGallery.min.js",css:"https://cdn.cbd.int/flickr-justified-gallery@2.1.2/dist/fjGallery.css"}},isPhotoFigcaption:!1,islazyload:!0,isAnchor:!1,shortcutKey:void 0,autoDarkmode:!0}</script><script id="config-diff">var GLOBAL_CONFIG_SITE={configTitle:"云少IT",title:"十、Java并发系列之 Java 并发编程面试题",postAI:"true - [面试]",pageFillDescription:"十、Java并发系列之 Java 并发编程面试题, Q1 进程和线程的区别？, Q2 如何创建一个线程实例并且运行它？, Q3 描述线程的不同状态以及何时发生状态转换 ？, Q4 Runnable 和 Callable 接口有什么区别？它们是如何使用的？, Q5 什么是守护线程它的使用场景是什么？如何创建守护线程 ？, 额外的, Q6 什么是 Thread 的中断标志？怎么设置和检查它？它与 InterruptedException 有什么关系？, Q7 什么是 Executor 和 ExecutorService ？这两个接口有什么区别？, Q8 java.util.concurrent 标准库中 ExecutorService 的可用实现是什么 ？, Q9 什么是 Java 内存模型（ JMM ）？描述下其目的和基本思想, Q10 什么是易失 （ volatile ） 字段JMM 对这样的领域有什么保证？, Q11 以下哪项操作是原子操作 ?, Q12 JMM 对添加了 final 修饰符的类的字段有什么特殊保证 ？, Q13 方法定义中 synchronized 关键字的含义是什么？静态方法？在一个块之前 ？, Q14 如果两个线程同时在不同的对象实例上调用 synchronized 方法这些线程中的一个是否会阻塞？如果该方法是静态的该怎么办?, Q15 Object类的 waitnotify 和 notifyAll 方法的目的是什么 ？, Q16 描述死锁存活锁和饥饿的条件。描述这些情况的可能原因 ?, Q17 描述 forkx2Fjoin 框架的用途和用例十并发系列之并发编程面试题这是我的小站欢迎访问哦应聘岗总是免不了几个并发编程的面试题不过大多数都局限在包下的知识和实现问题本文针对并发相关的常见的面试题做一些解释进程和线程的区别这是一个非常基础的面试题如果这道题没有回答的比较满意一般情况下面试官会认为应聘者在并发方面的基础只是不牢固就不会继续深入询问其它并发问题了进程和线程都是并发单元但它们有一个根本区别进程不共享公共内存而线程则共享从操作系统的角度来看进程是一个独立的软件在其自己的虚拟内存空间中运行任何一个多任务操作系统这几乎意味着任何现代操作系统都必须将内存中的进程分开这样一个失败的进程就不会通过加扰公共内存来拖累所有其它进程因此进程通常是隔离的它们通过进程间通信进行协作进程间通信由操作系统定义为一种中间相反线程是应用程序的一部分它与同一应用程序的其他线程共享公共内存使用公共内存可以减少大量开销因此使用线程可以更快的交换数据和进行线程间协作关于进程间通讯那一块可以不用回答如果你不懂的话不必然会导致接下来的某个问题是进程间通讯的的原理如何创建一个线程实例并且运行它这道题考察的是对的理解创建一个线程的实例有两种方法可供选择把的实例传递给的构造函数并调用方法是一个函数接口因此可以作为表达式传递因为线程本身也实现了接口所以另一种创建线程的方法是创建一个匿名子类覆写它的方法然后调用描述线程的不同状态以及何时发生状态转换这道题考察的是对线程生命周期的理解一般情况下我们会使用方法检查线程的状态线程的不同状态都定义在枚举中线程的所有状态如下所示一个尚未调用方法启动的新实例一个正在运行的线程它被称为因为在任何给定时间它要么正在运行要么在等待线程调度当调用方法时会将一个线程进入状态如果正在运行的线程需要进入同步部分但由于另一个线程持有此部分的监视器而无法执行此操作则该线程将被阻塞如果线程等待另一个线程执行特定操作则该线程进入此状态例如一个线程在它持有的监视器上调用法时进入此状态或者在另一个线程上调用方法也会进入此状态跟状态差不多但线程在调用或和其他一些方法的定时版本后进入此状态当一个线程已经完成它的方法的执行并终止时进入此状态和接口有什么区别它们是如何使用的接口表示必须在单独的线程中运行的计算单位它只有一个方法接口不允许此方法返回值或抛出未经检查的异常接口表示具有返回值的任务它只有一个方法方法可以返回一个值可以是也可以抛出一个异常通常在实例中用于启动异步任务然后调用返回的实例以获取其值什么是守护线程它的使用场景是什么如何创建守护线程守护线程是一个不阻止虚拟机退出的线程当所有非守护线程终止时只是放弃所有剩余的守护线程守护线程通常用于为其他线程执行一些支持或服务任务但我们应该考虑到它们可能随时被放弃要将一个线程作为守护线程启动应该在调用之前使用方法设置为守护线程如下所示额外的奇怪的是如果将上面的代码放在内运行则可能无法打印该消息而发生这种情况的原因是因为线程在守护线程运行到打印消息之前就已经终止我们不应该在守护线程中执行任何操作因为它们甚至无法执行其块并在被放弃时关闭资源什么是的中断标志怎么设置和检查它它与有什么关系中断标志或中断状态是线程中断时设置的内部线程标志属性要设置一个线程的中断标志只需要简单的在线程对象上调用方法如果在某个方法内部的一个线程抛出了等那么此方法会立即抛出线程可以根据自己的逻辑自由处理此异常如果一个线程不在这样的方法中并且调用了则不会发生任何特殊情况线程的中断状态可以通过使用静态方法或实例的方法定期检查这两个方法的区别是静态会清除了中断标志而则不会什么是和这两个接口有什么区别和是框架提供的两个相关接口是一个非常简单的接口只有一个方法接受实例来执行在大多数情况下这是我们的任务执行代码应该依赖的接口扩展了接口并且添加了许多其它方法以处理和检查并发任务执行服务的生命周期在关闭时终止任务和更复杂的异步任务处理包括更多和的知识可以访问一文秒懂标准库中的可用实现是什么这是一个非常变的问题问这个问题的面试官你想咋样啊接口有三个标准实现使用线程池执行任务一旦某个线程完成执行任务它就会回到线程池中如果池中的所有线程都忙则任务必须等待轮到它允许安排任务执行而不是简单的在线程可用时立即运行任务它还可以按固定频率或固定延迟安排任务是一个特殊的用于处理递归算法任务如果你使用常规进行递归算法那么你很快发现所有线程都在忙着等待较低级别的递归完成实现了所谓的工作窃取算法允许它更有效地使用可用线程什么是内存模型描述下其目的和基本思想内存模式是语言规范的一部分规定了多个线程如何访问并发应用程序中的公共内存以及一个线程的数据更改如何对其他线程可见是不是很简单虽然简短又简洁但如果没有强大的数学背景可能很难掌握对内存模型的需求源于这样一个事实代码访问数据的方式并不像它在底层实际发生的那样在保证内存读写的可观察结果是相同的情况下编译器编译器甚至都可以对内存读写进行重新排序或优化当我们的应用程序扩展到多个线程时这会导致反直觉的结果因为大多数这些优化只会考虑单个执行线程跨线程优化器仍然非常难以实现另一个可怕的问题是现代系统中的内存是多层的处理器的多个内核可能会在其缓存或读写缓冲区中保留一些非刷新数据这也会影响从其它内核观察到的内存状态更糟糕的是不同内存访问架构的存在将打破一次编写随处运行的承诺但另所有程序员高兴的是指定了在设计多线程应用程序时可能依赖的一些保证坚持这些保证有助于程序员编写在各种体系结构之间稳定且可移植的多线程代码的主要概念是动作这些是线程间的动作可以由一个线程执行并由另一个线程检测如读取或写入变量锁定解锁监视器等等同步动作某个动作子集例如读取写入易失性变量或锁定解锁监视器程序顺序俗称单个线程内可观察的动作总顺序同步顺序俗称所有同步操作之间的总顺序它必须与程序顺序一致也就是说如果两个同步操作在中一个接一个地出现它们在中以相同的顺序出现同步与俗称某些同步操作之间的关系例如解锁监视器和锁定同一监视器在另一个或同一个线程中发生在顺序之前将与结合在集合论中称为传递闭包以创建线程之间所有动作的部分排序如果一个动作发生在另一个动作之前则第二个动作可以观察到第一个动作的结果例如在一个线程中写入变量并在另一个线程中读取发生在一致性之前如果每次读取都遵循先前发生的顺序中对该位置的最后一次写入或者通过数据竞争进行其他一些写入操作则一组操作是一致的执行它们之间有一组有序的动作和一致性规则对于给定的程序我们可以观察到具有各种结果的多个不同的执行但是如果一个程序正确同步那么它的所有执行似乎都是顺序一致的这意味着我们可以将多线程程序推断为一系列按顺序发生的动作这样可以省去考虑引擎盖下重新排序优化或数据缓存的麻烦如果你了解协程相关的概念和协程很相像的什么是易失字段对这样的领域有什么保证根据内存模型参见字段具有特殊属性变量的读取和写入是同步操作这意味着它们具有总排序所有线程将遵循这些操作的一致顺序根据此顺序保证读取变量可以观察到对此变量的最后一次写入如果你有一个从多个线程访问的字段且至少有一个线程写入它那么你应该考虑使它变得否则某个线程从这个字段读取的内容并不会得到一丝的保证的另一个保证是写入和读取位值类型和类型的原子性如果没有修饰符读取此类字段可能会观察到另一个线程部分写入的值以下哪项操作是原子操作写入一个非类型写入一个类型写入一个非类型写入一个类型递增一个类型是不是瞬间蒙了我们来解释一下对类型位变量的写入保证是原子的无论它是否是易失性的类型位变量可能需要在两个单独的步骤中写入例如在位体系结构上因此默认情况下没有原子性保证但是如果添加了修饰符则保证以原子方式访问变量递增操作通常由多个步骤完成检索值更改它并写回因此它永远不会保证是原子的变量是易变的如果要实现值的原子增量则应使用类等对添加了修饰符的类的字段有什么特殊保证基本上会保证在任何线程获取对象之前初始化类的字段如果没有这种保证由于重新排序或其他优化在初始化该对象的所有字段之前可以向另一个线程发布对象的引用即变得可见这可能会导致对这些字段的访问这就是为什么在创建不可变对象时应始终将其所有字段设为即使它们不能通过方法访问方法定义中关键字的含义是什么静态方法在一个块之前块之前的关键字表示进入该块的任何线程都必须获取监视器括号中的对象如果监视器已被另一个线程获取则前一个线程将进入状态并等待监视器被释放同步实例方法具有相同的语义但会使用实例本身充当监视器对于静态同步方法监视器是表示声明类的对象如果两个线程同时在不同的对象实例上调用方法这些线程中的一个是否会阻塞如果该方法是静态的该怎么办如果方法是实例方法则实例充当方法的监视器在不同实例上调用该方法的两个线程获取不同的监视器因此它们都不会被阻塞如果方法是静态的则监视器是对象对于两个线程监视器是相同的因此其中一个可能会阻塞并等待另一个退出方法类的和方法的目的是什么拥有对象监视器的线程例如已进入由对象保护的同步部分的线程可以调用来临时释放监视器并为其他线程提供获取监视器的机会例如这可以在等待某个条件的情况下完成当另一个获取监视器的线程满足条件时它可以调用或并释放监视器方法唤醒处于等待状态的单个线程方法唤醒等待此监视器的所有线程并且它们都竞争重新获取锁定下面的实现演示了多个线程如何通过模式一起工作如果我们将一个元素放入一个空队列那么在方法中等待的所有线程都会唤醒并尝试接收该值如果我们将一个元素放入一个已经满了的队列方法将等待对方法的调用方法删除一个元素并通知在方法中等待队列对新项目有空位置的线程描述死锁存活锁和饥饿的条件描述这些情况的可能原因死锁是一组无法进行的线程中的条件因为组中的每个线程都必须获取已由组中的另一个线程获取的某些资源最简单的情况是两个线程需要锁定两个资源才能进行第一个资源已被一个线程锁定第二个资源已被另一个线程锁定因为这些线程永远不会获得对两个资源的锁定因此永远不会进展存活锁是多线程对自己生成的条件或事件做出反应的一种情况事件发生在一个线程中必须由另一个线程处理在此处理期间发生的新事件必须在第一个线程中处理依此类推这样的线程是活着的并且没有被阻挡但是仍然没有取得任何进展因为它们用无用的工作压倒了对方饥饿锁是线程无法获取资源的情况因为其他线程或多个线程占用它太长时间或具有更高的优先级线程无法取得进展因此无法完成有用的工作描述框架的用途和用例框架允许并行化递归算法使用之类的并行递归的主要问题是可能会快速耗尽线程因为每个递归步骤都需要自己的线程而堆栈中的线程将处于空闲状态并等待框架入口点是类它是的一个实现它实现了工作窃取算法空闲线程会试图从忙线程中窃取工作这允许在不同线程之间传播计算并在使用比通常的线程池所需的更少的线程时取得进展",isPost:!0,isHome:!1,isHighlightShrink:!0,isToc:!0,postUpdate:"2018-09-10 19:08:33",postMainColor:""}</script><noscript><style>#nav{opacity:1}.justified-gallery img{opacity:1}#post-meta time,#recent-posts time{display:inline!important}</style></noscript><script>(e=>{e.saveToLocal={set:(e,t,a)=>{var o;0!==a&&(o=Date.now(),localStorage.setItem(e,JSON.stringify({value:t,expiry:o+864e5*a})))},get:e=>{var t=localStorage.getItem(e);if(t){t=JSON.parse(t);if(!(Date.now()>t.expiry))return t.value;localStorage.removeItem(e)}}},e.getScript=(o,c={})=>new Promise((t,e)=>{const a=document.createElement("script");a.src=o,a.async=!0,a.onerror=e,a.onload=a.onreadystatechange=function(){var e=this.readyState;e&&"loaded"!==e&&"complete"!==e||(a.onload=a.onreadystatechange=null,t())},Object.keys(c).forEach(e=>{a.setAttribute(e,c[e])}),document.head.appendChild(a)}),e.getCSS=(o,c=!1)=>new Promise((t,e)=>{const a=document.createElement("link");a.rel="stylesheet",a.href=o,c&&(a.id=c),a.onerror=e,a.onload=a.onreadystatechange=function(){var e=this.readyState;e&&"loaded"!==e&&"complete"!==e||(a.onload=a.onreadystatechange=null,t())},document.head.appendChild(a)}),e.activateDarkMode=()=>{document.documentElement.setAttribute("data-theme","dark"),null!==document.querySelector('meta[name="theme-color"]')&&document.querySelector('meta[name="theme-color"]').setAttribute("content","#0d0d0d")},e.activateLightMode=()=>{document.documentElement.setAttribute("data-theme","light"),null!==document.querySelector('meta[name="theme-color"]')&&document.querySelector('meta[name="theme-color"]').setAttribute("content","#ffffff")};var e=saveToLocal.get("theme"),t=window.matchMedia("(prefers-color-scheme: dark)").matches,a=window.matchMedia("(prefers-color-scheme: light)").matches,o=window.matchMedia("(prefers-color-scheme: no-preference)").matches,c=!t&&!a&&!o,t=(void 0===e?(a?activateLightMode():t?activateDarkMode():(o||c)&&((a=(new Date).getHours())<=6||18<=a?activateDarkMode:activateLightMode)(),window.matchMedia("(prefers-color-scheme: dark)").addListener(e=>{void 0===saveToLocal.get("theme")&&(e.matches?activateDarkMode:activateLightMode)()})):("light"===e?activateLightMode:activateDarkMode)(),saveToLocal.get("aside-status"));void 0!==t&&("hide"===t?document.documentElement.classList.add("hide-aside"):document.documentElement.classList.remove("hide-aside"));/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)&&document.documentElement.classList.add("apple")})(window)</script><link rel="stylesheet" href="/css/1.min.css?1" media="async" onload='this.media="all"'><link rel="stylesheet" href="/css/bg.css?1" media="async" onload='this.media="all"'><meta name="generator" content="Hexo 6.3.0"><link rel="alternate" href="/atom.xml" title="云少IT" type="application/atom+xml"><link rel="alternate" href="/rss.xml" title="云少IT" type="application/rss+xml"></head><body data-type="anzhiyu"><div id="web_bg"></div><div id="an_music_bg"></div><link rel="stylesheet" href="https://cdn.cbd.int/anzhiyu-theme-static@1.1.10/progress_bar/progress_bar.css"><script async src="https://cdn.cbd.int/pace-js@1.2.4/pace.min.js" data-pace-options="{ &quot;restartOnRequestAfter&quot;:false,&quot;eventLag&quot;:false}"></script><div class="post" id="body-wrap"><header class="post-bg" id="page-header"><nav id="nav"><div id="nav-group"><span id="blog_name"><div class="back-home-button"><i class="anzhiyufont anzhiyu-icon-grip-vertical"></i><div class="back-menu-list-groups"><div class="back-menu-list-group"><div class="back-menu-list-title">网页</div><div class="back-menu-list"><a class="back-menu-item" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.tryrun.top/" title="博客"><img class="back-menu-item-icon" src="/img/favicon.ico" alt="博客"><span class="back-menu-item-text">博客</span></a></div></div><div class="back-menu-list-group"><div class="back-menu-list-title">项目</div><div class="back-menu-list"><a class="back-menu-item" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.tryrun.top" title="图床"><img class="back-menu-item-icon" src="https://www.tryrun.top/favicon.ico" alt="图床"><span class="back-menu-item-text">图床</span></a></div></div></div></div><a id="site-name" href="/" accesskey="h"><div class="title">云少IT</div><i class="anzhiyufont anzhiyu-icon-house-chimney"></i></a></span><div class="mask-name-container"><div id="name-container"><a id="page-name" href="javascript:anzhiyu.scrollToDest(0, 500)" rel="external nofollow noreferrer">PAGE_NAME</a></div></div><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><span>望四方</span></a><ul class="menus_item_child"><li><a class="site-page child faa-parent animated-hover" href="/archives/"><i class="anzhiyufont anzhiyu-icon-box-archive faa-tada" style="font-size:.9em"></i><span> 归名档</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/categories/"><i class="anzhiyufont anzhiyu-icon-shapes faa-tada" style="font-size:.9em"></i><span> 归四类</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/tags/"><i class="anzhiyufont anzhiyu-icon-tags faa-tada" style="font-size:.9em"></i><span> 书中签</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/charts/"><i class="fa-fw fas fa-chart-bar faa-tada"></i><span> 统计</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><span>友链</span></a><ul class="menus_item_child"><li><a class="site-page child faa-parent animated-hover" href="/link/"><i class="anzhiyufont anzhiyu-icon-link faa-tada" style="font-size:.9em"></i><span> 四方好友</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/fcircle/"><i class="anzhiyufont anzhiyu-icon-artstation faa-tada" style="font-size:.9em"></i><span> 朋友圈</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/comments/"><i class="anzhiyufont anzhiyu-icon-envelope faa-tada" style="font-size:.9em"></i><span> 留言板</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><span>我的</span></a><ul class="menus_item_child"><li><a class="site-page child faa-parent animated-hover" href="/bangumis/"><i class="anzhiyufont anzhiyu-icon-bilibili faa-tada" style="font-size:.9em"></i><span> 追番页</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/album/"><i class="anzhiyufont anzhiyu-icon-images faa-tada" style="font-size:.9em"></i><span> 刹那间</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/equipment/"><i class="fas fa-heart faa-tada"></i><span> 我的装备</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/collect/"><i class="fas fa-camcorder faa-tada"></i><span> 观影阁</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><span>关于</span></a><ul class="menus_item_child"><li><a class="site-page child faa-parent animated-hover" href="/about/"><i class="anzhiyufont anzhiyu-icon-paper-plane faa-tada" style="font-size:.9em"></i><span> 关于本人</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/essay/"><i class="anzhiyufont anzhiyu-icon-lightbulb faa-tada" style="font-size:.9em"></i><span> 闲言碎语</span></a></li><li><a class="site-page child faa-parent animated-hover" href="javascript:toRandomPost()" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-shoe-prints1 faa-tada" style="font-size:.9em"></i><span> 随便逛逛</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/disclaimer/"><i class="fas fa-heart faa-tada"></i><span> 免责声明</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/love/"><i class="anzhiyufont anzhiyu-icon-heartbeat faa-tada" style="font-size:.9em"></i><span> 恋爱小屋</span></a></li></ul></div></div></div><div id="nav-right"><div class="nav-button only-home" id="travellings_button" title="随机前往一个开往项目网站"><a class="site-page" onclick="anzhiyu.totraveling()" title="随机前往一个开往项目网站" href="javascript:void(0);" rel="external nofollow" data-pjax-state="external"><i class="anzhiyufont anzhiyu-icon-train"></i></a></div><div class="nav-button" id="randomPost_button"><a class="site-page" onclick="toRandomPost()" title="随机前往一个文章" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-dice"></i></a></div><div class="nav-button" id="search-button"><a class="site-page social-icon search" href="javascript:void(0);" rel="external nofollow noreferrer" title="搜索🔍" accesskey="s"><i class="anzhiyufont anzhiyu-icon-magnifying-glass"></i><span> 搜索</span></a></div><input id="center-console" type="checkbox"><label class="widget" for="center-console" title="中控台" onclick="anzhiyu.switchConsole()"><i class="left"></i><i class="widget center"></i><i class="widget right"></i></label><div id="console"><div class="console-card-group-reward"><ul class="reward-all console-card"><li class="reward-item"><a href="/img/wxpay.webp" target="_blank"><img class="post-qr-code-img" alt="wechat" src="/img/wxpay.webp"></a><div class="post-qr-code-desc">wechat</div></li><li class="reward-item"><a href="/img/alipay.webp" target="_blank"><img class="post-qr-code-img" alt="alipay" src="/img/alipay.webp"></a><div class="post-qr-code-desc">alipay</div></li></ul></div><div class="console-card-group"><div class="console-card-group-left"><div class="console-card" id="card-newest-comments"><div class="card-content"><div class="author-content-item-tips">互动</div><span class="author-content-item-title">最新评论</span></div><div class="aside-list"><span>正在加载中...</span></div></div></div><div class="console-card-group-right"><div class="console-card tags"><div class="card-content"><div class="author-content-item-tips">兴趣点</div><span class="author-content-item-title">寻找你感兴趣的领域</span><div class="card-tags"><div class="item-headline"></div><div class="card-tag-cloud"><a href="/tags/API/" style="font-size:1.05rem;color:#637571">API<sup>43</sup></a><a href="/tags/Base64/" style="font-size:1.05rem;color:#8a0460">Base64<sup>1</sup></a><a href="/tags/Collectors/" style="font-size:1.05rem;color:#6b3641">Collectors<sup>3</sup></a><a href="/tags/Date/" style="font-size:1.05rem;color:#5e6603">Date<sup>3</sup></a><a href="/tags/Executor/" style="font-size:1.05rem;color:#abb61f">Executor<sup>9</sup></a><a href="/tags/Guava/" style="font-size:1.05rem;color:#6dc55c">Guava<sup>1</sup></a><a href="/tags/JVM/" style="font-size:1.05rem;color:#8745c2">JVM<sup>8</sup></a><a href="/tags/Java8/" style="font-size:1.05rem;color:#804042">Java8<sup>21</sup></a><a href="/tags/Java9/" style="font-size:1.05rem;color:#21b4c6">Java9<sup>21</sup></a><a href="/tags/Java%E5%B9%B6%E5%8F%91/" style="font-size:1.05rem;color:#0a3988">Java并发<sup>20</sup></a><a href="/tags/Lambda/" style="font-size:1.05rem;color:#29446d">Lambda<sup>4</sup></a><a href="/tags/Lock/" style="font-size:1.05rem;color:#afc378">Lock<sup>1</sup></a><a href="/tags/Maven/" style="font-size:1.05rem;color:#b10843">Maven<sup>1</sup></a><a href="/tags/Memcached/" style="font-size:1.05rem;color:#9663a4">Memcached<sup>23</sup></a><a href="/tags/Mongodb/" style="font-size:1.05rem;color:#b4214d">Mongodb<sup>49</sup></a><a href="/tags/Queue/" style="font-size:1.05rem;color:#220f01">Queue<sup>1</sup></a><a href="/tags/Redis/" style="font-size:1.05rem;color:#c4106c">Redis<sup>27</sup></a><a href="/tags/Stream/" style="font-size:1.05rem;color:#1f5f9f">Stream<sup>4</sup></a><a href="/tags/Thread/" style="font-size:1.05rem;color:#c3563b">Thread<sup>7</sup></a><a href="/tags/Thread-pool/" style="font-size:1.05rem;color:#1a3364">Thread pool<sup>7</sup></a><a href="/tags/forkJoinPool/" style="font-size:1.05rem;color:#1ea132">forkJoinPool<sup>2</sup></a><a href="/tags/stream/" style="font-size:1.05rem;color:#a00679">stream<sup>1</sup></a><a href="/tags/%E4%B8%93%E6%A0%8F/" style="font-size:1.05rem;color:#9e5e9b">专栏<sup>35</sup></a><a href="/tags/%E4%BA%8B%E5%8A%A1/" style="font-size:1.05rem;color:#4d47bc">事务<sup>1</sup></a><a href="/tags/%E4%BC%98%E5%8C%96/" style="font-size:1.05rem;color:#a56245">优化<sup>1</sup></a><a href="/tags/%E5%91%BD%E4%BB%A4/" style="font-size:1.05rem;color:#9c8435">命令<sup>57</sup></a><a href="/tags/%E5%AE%89%E8%A3%85/" style="font-size:1.05rem;color:#647e28">安装<sup>6</sup></a><a href="/tags/%E5%B7%A5%E5%85%B7/" style="font-size:1.05rem;color:#a192b9">工具<sup>2</sup></a><a href="/tags/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/" style="font-size:1.05rem;color:#22a370">数据类型<sup>8</sup></a><a href="/tags/%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/" style="font-size:1.05rem;color:#6b985c">生命周期<sup>1</sup></a><a href="/tags/%E7%AE%80%E4%BB%8B/" style="font-size:1.05rem;color:#bc5f40">简介<sup>7</sup></a><a href="/tags/%E7%AE%97%E6%B3%95/" style="font-size:1.05rem;color:#167366">算法<sup>10</sup></a><a href="/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" style="font-size:1.05rem;color:#aa928f">设计模式<sup>38</sup></a><a href="/tags/%E9%85%8D%E7%BD%AE/" style="font-size:1.05rem;color:#3a740b">配置<sup>2</sup></a><a href="/tags/%E9%9D%A2%E8%AF%95/" style="font-size:1.05rem;color:#75c343">面试<sup>11</sup></a></div></div><hr></div></div><div class="console-card history"><div class="item-headline"><i class="anzhiyufont anzhiyu-icon-box-archiv"></i><span>文章</span></div><div class="card-archives"><div class="item-headline"><i class="anzhiyufont anzhiyu-icon-archive"></i><span>归档</span><a class="card-more-btn" href="/archives/" title="查看更多"> <i class="anzhiyufont anzhiyu-icon-angle-right"></i></a></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/06/"><span class="card-archive-list-date">六月 2023</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span>篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2021/05/"><span class="card-archive-list-date">五月 2021</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">2</span><span>篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/10/"><span class="card-archive-list-date">十月 2020</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">21</span><span>篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/09/"><span class="card-archive-list-date">九月 2020</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">44</span><span>篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/08/"><span class="card-archive-list-date">八月 2020</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">47</span><span>篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/07/"><span class="card-archive-list-date">七月 2020</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">42</span><span>篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/06/"><span class="card-archive-list-date">六月 2020</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">31</span><span>篇</span></div></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/05/"><span class="card-archive-list-date">五月 2020</span><div class="card-archive-list-count-group"><span class="card-archive-list-count">43</span><span>篇</span></div></a></li></ul></div><hr></div></div></div><div class="button-group"><div class="console-btn-item"><a class="darkmode_switchbutton" title="显示模式切换" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-moon"></i></a></div><div class="console-btn-item" id="consoleHideAside" onclick="anzhiyu.hideAsideBtn()" title="边栏显示控制"><a class="asideSwitch"><i class="anzhiyufont anzhiyu-icon-arrows-left-right"></i></a></div><div class="console-btn-item on" id="consoleCommentBarrage" onclick="anzhiyu.switchCommentBarrage()" title="热评开关"><a class="commentBarrage"><i class="anzhiyufont anzhiyu-icon-message"></i></a></div><div class="console-btn-item" id="consoleMusic" onclick="anzhiyu.musicToggle()" title="音乐开关"><a class="music-switch"><i class="anzhiyufont anzhiyu-icon-music"></i></a></div></div><div class="console-mask" onclick="anzhiyu.hideConsole()" href="javascript:void(0);" rel="external nofollow noreferrer"></div></div><div class="nav-button" id="nav-totop"><a class="totopbtn" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-arrow-up"></i><span id="percent" onclick="anzhiyu.scrollToDest(0,500)">0</span></a></div><div id="toggle-menu"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer" title="切换"><i class="anzhiyufont anzhiyu-icon-bars"></i></a></div></div></div></nav><div id="post-info"><div id="post-firstinfo"><div class="meta-firstline"><a class="post-meta-original">原创</a><span class="post-meta-categories"><span class="post-meta-separator"></span><i class="anzhiyufont anzhiyu-icon-inbox post-meta-icon"></i><a class="post-meta-categories" href="/categories/Java/" itemprop="url">Java</a></span><span class="article-meta tags"><a class="article-meta__tags" href="/tags/Java%E5%B9%B6%E5%8F%91/" tabindex="-1" itemprop="url"> <span><i class="anzhiyufont anzhiyu-icon-hashtag"></i>Java并发</span></a><a class="article-meta__tags" href="/tags/%E9%9D%A2%E8%AF%95/" tabindex="-1" itemprop="url"> <span><i class="anzhiyufont anzhiyu-icon-hashtag"></i>面试</span></a></span></div></div><h1 class="post-title" itemprop="name headline">十、Java并发系列之 Java 并发编程面试题</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="anzhiyufont anzhiyu-icon-calendar-days post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" itemprop="dateCreated datePublished" datetime="2018-09-10T11:08:33.000Z" title="发表于 2018-09-10 19:08:33">2018-09-10</time><span class="post-meta-separator"></span><i class="anzhiyufont anzhiyu-icon-history post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" itemprop="dateCreated datePublished" datetime="2018-09-10T11:08:33.000Z" title="更新于 2018-09-10 19:08:33">2018-09-10</time></span></div><div class="meta-secondline"><span class="post-meta-separator"></span><span class="post-meta-wordcount"><i class="anzhiyufont anzhiyu-icon-file-word post-meta-icon" title="文章字数"></i><span class="post-meta-label" title="文章字数">字数总计:</span><span class="word-count" title="文章字数">4.8k</span><span class="post-meta-separator"></span><i class="anzhiyufont anzhiyu-icon-clock post-meta-icon" title="阅读时长"></i><span class="post-meta-label" title="阅读时长">阅读时长:</span><span>15分钟</span></span><span class="post-meta-separator"></span><span class="post-meta-pv-cv" data-flag-title="十、Java并发系列之 Java 并发编程面试题"><i class="anzhiyufont anzhiyu-icon-fw-eye post-meta-icon"></i><span class="post-meta-label" title="阅读量">阅读量:</span><span id="busuanzi_value_page_pv"><i class="anzhiyufont anzhiyu-icon-spinner anzhiyu-spin"></i></span></span><span class="post-meta-separator"> </span><span class="post-meta-position" title="作者IP属地为武汉"><i class="anzhiyufont anzhiyu-icon-location-dot"></i>武汉</span></div></div></div><section class="main-hero-waves-area waves-area"><svg class="waves-svg" xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto"><defs><path id="gentle-wave" d="M -160 44 c 30 0 58 -18 88 -18 s 58 18 88 18 s 58 -18 88 -18 s 58 18 88 18 v 44 h -352 Z"></path></defs><g class="parallax"><use href="#gentle-wave" x="48" y="0"></use><use href="#gentle-wave" x="48" y="3"></use><use href="#gentle-wave" x="48" y="5"></use><use href="#gentle-wave" x="48" y="7"></use></g></svg></section><div id="post-top-cover"><img class="nolazyload" id="post-top-bg" src="https://cn.bing.com/th?id=OHR.LimerickDay_EN-US4512689467_UHD.jpg"></div></header><main id="blog-container"><div class="layout" id="content-inner"><div id="post"><div class="post-ai-description"><div class="ai-title"><i class="anzhiyufont anzhiyu-icon-bilibili"></i><div class="ai-title-text">AI-摘要</div><i class="anzhiyufont anzhiyu-icon-arrow-rotate-right"></i><i class="anzhiyufont anzhiyu-icon-circle-dot" title="朗读摘要"></i><div id="ai-tag">Tianli GPT</div></div><div class="ai-explanation">AI初始化中...</div><div class="ai-btn-box"><div class="ai-btn-item">介绍自己 🙈</div><div class="ai-btn-item">生成本文简介 👋</div><div class="ai-btn-item">推荐相关文章 📖</div><div class="ai-btn-item">前往主页 🏠</div><div class="ai-btn-item" id="go-tianli-blog">前往爱发电购买</div></div><script data-pjax src="/js/anzhiyu/ai_abstract.js"></script></div><article class="post-content" id="article-container" itemscope itemtype="https://it985.github.io/posts/774c589b.html"><header><a class="post-meta-categories" href="/categories/Java/" itemprop="url">Java</a><a href="/tags/Java%E5%B9%B6%E5%8F%91/" tabindex="-1" itemprop="url">Java并发</a><a href="/tags/%E9%9D%A2%E8%AF%95/" tabindex="-1" itemprop="url">面试</a><h1 id="CrawlerTitle" itemprop="name headline">十、Java并发系列之 Java 并发编程面试题</h1><span itemprop="author" itemscope itemtype="http://schema.org/Person">云少</span><time itemprop="dateCreated datePublished" datetime="2018-09-10T11:08:33.000Z" title="发表于 2018-09-10 19:08:33">2018-09-10</time><time itemprop="dateCreated datePublished" datetime="2018-09-10T11:08:33.000Z" title="更新于 2018-09-10 19:08:33">2018-09-10</time></header><h1 id="十、Java并发系列之-Java-并发编程面试题"><a href="#十、Java并发系列之-Java-并发编程面试题" class="headerlink" title="十、Java并发系列之 Java 并发编程面试题"></a>十、Java并发系列之 Java 并发编程面试题</h1><blockquote><p>master ，这是我的<a target="_blank" rel="noopener external nofollow noreferrer" href="https://www.tryrun.top/">小站</a>,欢迎访问哦~~</p></blockquote><p>应聘 Java 岗，总是免不了几个 Java 并发编程的面试题，不过大多数都局限在 <code>java.util.concurrent</code> 包下的知识和实现问题。本文针对 Java 并发相关的常见的面试题做一些解释。</p><h2 id="Q1-进程和线程的区别？"><a href="#Q1-进程和线程的区别？" class="headerlink" title="Q1: 进程和线程的区别？"></a><strong>Q1: 进程和线程的区别？</strong></h2><blockquote><p>这是一个非常基础的面试题，如果这道题没有回答的比较满意，一般情况下，面试官会认为应聘者在并发方面的基础只是不牢固，就不会继续深入询问其它并发问题了。</p></blockquote><p>1、进程和线程都是并发单元，但它们有一个根本区别：<strong>进程不共享公共内存，而线程则共享</strong>。<br>2、从操作系统的角度来看，进程是一个独立的软件，在其自己的虚拟内存空间中运行。任何一个多任务操作系统（这几乎意味着任何现代操作系统）都必须将内存中的进程分开，这样一个失败的进程就不会通过加扰公共内存来拖累所有其它进程。因此，进程通常是隔离的，它们通过进程间通信进行协作，进程间通信由操作系统定义为一种中间 API。<br>3、相反，线程是应用程序的一部分，它与同一应用程序的其他线程共享公共内存。使用公共内存可以减少大量开销，因此使用线程可以更快的交换数据和进行线程间协作。</p><blockquote><p>关于进程间通讯那一块可以不用回答，如果你不懂的话，不必然会导致接下来的某个问题是 进程间通讯的的原理.</p></blockquote><h2 id="Q2-如何创建一个线程实例并且运行它？"><a href="#Q2-如何创建一个线程实例并且运行它？" class="headerlink" title="Q2: 如何创建一个线程实例并且运行它？"></a><strong>Q2: 如何创建一个线程实例并且运行它？</strong></h2><blockquote><p>这道题考察的是对 Runnable 的理解。</p></blockquote><p>创建一个线程的实例，有两种方法可供选择:</p><p>1、把 Runnable 的实例传递给 Thread 的构造函数并调用 <code>start()</code> 方法</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Thread</span> <span class="variable">thread1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Thread</span>(() -&gt;</span><br><span class="line">  System.out.println(<span class="string">&quot;Hello World from Runnable!&quot;</span>));</span><br><span class="line">thread1.start();</span><br></pre></td></tr></table></figure><p>Runnable是一个函数接口，因此可以作为 lambda 表达式传递<br>2、因为线程本身也实现了 Runnable 接口，所以另一种创建线程的方法是创建一个匿名子类，覆写它的 <code>run()</code> 方法，然后调用 <code>start()</code></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Thread</span> <span class="variable">thread2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Thread</span>() &#123;</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;Hello World from subclass!&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line">thread2.start();</span><br></pre></td></tr></table></figure><h2 id="Q3-描述线程的不同状态以及何时发生状态转换-？"><a href="#Q3-描述线程的不同状态以及何时发生状态转换-？" class="headerlink" title="Q3: 描述线程的不同状态以及何时发生状态转换 ？"></a><strong>Q3: 描述线程的不同状态以及何时发生状态转换 ？</strong></h2><blockquote><p>这道题考察的是对线程生命周期的理解。</p></blockquote><p>1、一般情况下，我们会使用 <code>Thread.getState()</code> 方法检查线程 ( Thread ) 的状态。<br>2、线程的不同状态都定义在 <code>Thread.State</code> 枚举中。<br>3、线程的所有状态如下所示</p><p>1、<strong>NEW</strong> : 一个尚未调用 <code>Thread.start()</code> 方法启动的新 Thread 实例。<br>2、<strong>RUNNABLE</strong> : 一个正在运行的线程。它被称为 runnable，因为在任何给定时间，它要么正在运行要么在等待线程调度。当调用<code>Thread.start()</code> 方法时，会将一个 <code>NEW</code> 线程进入 <code>RUNNABLE</code> 状态。<br>3、<strong>BLOCKED</strong> : 如果正在运行的线程需要进入同步部分但由于另一个线程持有此部分的监视器而无法执行此操作，则该线程将被阻塞。<br>4、<strong>WAITING</strong> : 如果线程等待另一个线程执行特定操作，则该线程进入此状态。例如，一个线程在它持有的监视器上调用 <code>Object.wait()</code> 法时进入此状态，或者在另一个线程上调用 <code>Thread.join()</code> 方法也会进入此状态。<br>5、<strong>IMED_WAITING</strong> : 跟 <strong>WAITING</strong> 状态差不多。但线程在调用 <code>Thread.sleep()</code>、<code>Object.wait()</code>、或 <code>Thread.join()</code> 和其他一些方法的定时版本后进入此状态<br>6、<strong>TERMINATED</strong> ： 当一个线程已经完成它的 <code>Runnable.run()</code> 方法的执行并终止时进入此状态。</p><h2 id="Q4-Runnable-和-Callable-接口有什么区别？它们是如何使用的？"><a href="#Q4-Runnable-和-Callable-接口有什么区别？它们是如何使用的？" class="headerlink" title="Q4: Runnable 和 Callable 接口有什么区别？它们是如何使用的？"></a>Q4: Runnable 和 Callable 接口有什么区别？它们是如何使用的？</h2><p>1、Runnable 接口表示必须在单独的线程中运行的计算单位，它只有一个 <code>run()</code> 方法。Runnable 接口不允许此方法返回值或抛出未经检查的异常。<br>2、Callable 接口表示具有返回值的任务，它只有一个 <code>call()</code> 方法。<code>call()</code> 方法可以返回一个值 ( 可以是 Void )，也可以抛出一个异常。Callable 通常在 <code>ExecutorService</code> 实例中用于启动异步任务，然后调用返回的 Future 实例以获取其值。</p><h2 id="Q5-什么是守护线程，它的使用场景是什么？如何创建守护线程-？"><a href="#Q5-什么是守护线程，它的使用场景是什么？如何创建守护线程-？" class="headerlink" title="Q5: 什么是守护线程，它的使用场景是什么？如何创建守护线程 ？"></a>Q5: 什么是守护线程，它的使用场景是什么？如何创建守护线程 ？</h2><p>1、守护线程是一个不阻止 Java 虚拟机 ( JVM ) 退出的线程。当所有非守护线程终止时，JVM 只是放弃所有剩余的守护线程。<br>2、守护线程通常用于为其他线程执行一些支持或服务任务，但我们应该考虑到它们可能随时被放弃。<br>3、要将一个线程作为守护线程启动，应该在调用 <code>start()</code> 之前使用 <code>setDaemon()</code>方法设置为守护线程。如下所示</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Thread</span> <span class="variable">daemon</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Thread</span>(()</span><br><span class="line">  -&gt; System.out.println(<span class="string">&quot;Hello from daemon!&quot;</span>));</span><br><span class="line">daemon.setDaemon(<span class="literal">true</span>);</span><br><span class="line">daemon.start();</span><br></pre></td></tr></table></figure><h3 id="额外的"><a href="#额外的" class="headerlink" title="额外的"></a>额外的</h3><p>奇怪的是，如果将上面的代码放在 <code>main()</code> 内运行，则可能无法打印该消息。而发生这种情况的原因，是因为 <code>main()</code> 线程在守护线程运行到打印消息之前就已经终止。</p><p>我们不应该在守护线程中执行任何 I&#x2F;O 操作，因为它们甚至无法执行其 finally 块并在被放弃时关闭资源。</p><h2 id="Q6-什么是-Thread-的中断标志？怎么设置和检查它？它与-InterruptedException-有什么关系？"><a href="#Q6-什么是-Thread-的中断标志？怎么设置和检查它？它与-InterruptedException-有什么关系？" class="headerlink" title="Q6: 什么是 Thread 的中断标志？怎么设置和检查它？它与 InterruptedException 有什么关系？"></a>Q6: 什么是 Thread 的中断标志？怎么设置和检查它？它与 InterruptedException 有什么关系？</h2><p>1、中断 ( interrupt ) 标志或中断状态是线程中断时设置的内部线程标志 ( <code>flag</code> 属性 ）。<br>2、要设置一个线程的中断标志，只需要简单的在线程对象上调用 <code>thread.interrupt()</code> 方法。<br>3、如果在某个方法内部的一个线程抛出了 <code>InterruptedException</code>（ <code>wait</code>、<code>join</code>、<code>sleep</code> 等 ），那么此方法会立即抛出InterruptedException。线程可以根据自己的逻辑自由处理此异常。如果一个线程不在这样的方法中并且调用了 <code>thread.interrupt()</code>，则不会发生任何特殊情况。<br>4、线程的中断状态可以通过使用静态 <code>Thread.interrupted()</code> 方法或实例的 <code>isInterrupted()</code> 方法定期检查。这两个方法的区别是静态<code>Thread.interrupt()</code> 会清除了中断标志，而 <code>isInterrupted()</code> 则不会。</p><h2 id="Q7-什么是-Executor-和-ExecutorService-？这两个接口有什么区别？"><a href="#Q7-什么是-Executor-和-ExecutorService-？这两个接口有什么区别？" class="headerlink" title="Q7: 什么是 Executor 和 ExecutorService ？这两个接口有什么区别？"></a>Q7: 什么是 Executor 和 ExecutorService ？这两个接口有什么区别？</h2><p>1、<code>Executor</code> 和 <code>ExecutorService</code> 是 <code>java.util.concurrent</code> 框架提供的两个相关接口。<br>2、<code>Executor</code> 是一个非常简单的接口，只有一个 <code>execute()</code> 方法接受 Runnable 实例来执行。在大多数情况下，这是我们的任务执行代码应该依赖的接口。<br>3、<code>ExecutorService</code> 扩展了 <code>Executor</code> 接口，并且添加了许多其它方法以处理和检查并发任务执行服务的生命周期（在关闭时终止任务）和更复杂的异步任务处理，包括 Futures。</p><blockquote><p>更多 Executor 和 ExecutorService 的知识，可以访问 一文秒懂 Java ExecutorService。</p></blockquote><h2 id="Q8-java-util-concurrent-标准库中-ExecutorService-的可用实现是什么-？"><a href="#Q8-java-util-concurrent-标准库中-ExecutorService-的可用实现是什么-？" class="headerlink" title="Q8: java.util.concurrent 标准库中 ExecutorService 的可用实现是什么 ？"></a>Q8: java.util.concurrent 标准库中 ExecutorService 的可用实现是什么 ？</h2><blockquote><p>这是一个非常变 tai 的问题。问这个问题的面试官，你想咋样啊 ？</p></blockquote><p>ExecutorService 接口有三个标准实现</p><p>1、<code>ThreadPoolExecutor</code> : 使用线程池执行任务。一旦某个线程完成执行任务，它就会回到线程池中。如果池中的所有线程都忙，则任务必须等待轮到它。<br>2、<code>ScheduledThreadPoolExecutor</code> : 允许安排任务执行，而不是简单的在线程可用时立即运行任务。它还可以按固定频率或固定延迟安排任务。<br>3、<code>ForkJoinPool</code> : 是一个特殊的 ExecutorService，用于处理递归算法任务。如果你使用常规 ThreadPoolExecutor 进行递归算法，那么你很快发现所有线程都在忙着等待较低级别的递归完成。ForkJoinPool 实现了所谓的工作窃取算法，允许它更有效地使用可用线程。</p><h2 id="Q9-什么是-Java-内存模型（-JMM-）？描述下其目的和基本思想"><a href="#Q9-什么是-Java-内存模型（-JMM-）？描述下其目的和基本思想" class="headerlink" title="Q9: 什么是 Java 内存模型（ JMM ）？描述下其目的和基本思想"></a>Q9: 什么是 Java 内存模型（ JMM ）？描述下其目的和基本思想</h2><p>Java 内存模式是 Java 语言规范的一部分</p><p>JMM 规定了多个线程如何访问并发 Java 应用程序中的公共内存，以及一个线程的数据更改如何对其他线程可见。</p><p>是不是很简单，虽然简短又简洁，但如果没有强大的数学背景，JMM 可能很难掌握。</p><p>对内存模型的需求源于这样一个事实：<strong>Java 代码访问数据的方式并不像它在底层实际发生的那样</strong>。</p><p>在保证内存读写的可观察结果是相同的情况下，Java 编译器，JIT 编译器甚至 CPU 都可以对内存读写进行重新排序或优化。</p><p>当我们的应用程序扩展到多个线程时，这会导致反直觉的结果，因为大多数这些优化只会考虑单个执行线程（ 跨线程优化器仍然非常难以实现 ）。</p><p>另一个可怕的问题是现代系统中的内存是多层的：<strong>处理器的多个内核可能会在其缓存或读&#x2F;写缓冲区中保留一些非刷新数据，这也会影响从其它内核观察到的内存状态</strong>。</p><p>更糟糕的是，不同内存访问架构的存在将打破Java 「 一次编写，随处运行 」 的承诺。</p><p>但另所有 Java 程序员高兴的是，JMM 指定了在设计多线程应用程序时可能依赖的一些保证。坚持这些保证有助于程序员编写在各种体系结构之间稳定且可移植的多线程代码。</p><p>JMM 的主要概念是：</p><ul><li><strong>动作 ( Action )</strong> : 这些是线程间的动作，可以由一个线程执行并由另一个线程检测，如读取或写入变量，锁定&#x2F;解锁监视器等等。</li><li><strong>同步动作 ( Synchronization actions )</strong> : 某个动作子集，例如读取&#x2F;写入易失性变量，或锁定&#x2F;解锁监视器。</li><li><strong>程序顺序 ( Program Order )</strong> : 俗称 <code>PO</code>，单个线程内可观察的动作总顺序。</li><li><strong>同步顺序 ( Synchronization Order )</strong> : 俗称 <code>SO</code>，所有同步操作之间的总顺序 – 它必须与程序顺序一致，也就是说，如果两个同步操作在PO 中一个接一个地出现，它们在 SO 中以相同的顺序出现 。</li><li><strong>同步与（ synchronizes-with）</strong> : 俗称 <code>SW</code> ，某些同步操作之间的关系，例如解锁监视器和锁定同一监视器（ 在另一个或同一个线程中 ）。</li><li><strong>发生在顺序之前 ( Happens-before Order )</strong> : 将 PO 与 SW 结合（ 在集合论中称为传递闭包 ），以创建线程之间所有动作的部分排序。如果一个动作发生在另一个动作之前，则第二个动作可以观察到第一个动作的结果（ 例如，在一个线程中写入变量并在另一个线程中读取 ）。</li><li><strong>发生在一致性之前 ( Happens-before consistency )</strong> : 如果每次读取都遵循先前发生的顺序中对该位置的最后一次写入，或者通过数据竞争进行其他一些写入操作，则一组操作是 HB 一致的。</li><li><strong>执行 ( Execution )</strong> : 它们之间有一组有序的动作和一致性规则</li></ul><p>对于给定的程序，我们可以观察到具有各种结果的多个不同的执行.但是如果一个程序正确同步，那么它的所有执行似乎都是顺序一致的，这意味着我们可以将多线程程序推断为一系列按顺序发生的动作。这样可以省去考虑引擎盖下重新排序，优化或数据缓存的麻烦。</p><blockquote><p>如果你了解协程，相关的概念和协程很相像的。</p></blockquote><h2 id="Q10-什么是易失-（-volatile-）-字段，JMM-对这样的领域有什么保证？"><a href="#Q10-什么是易失-（-volatile-）-字段，JMM-对这样的领域有什么保证？" class="headerlink" title="Q10: 什么是易失 （ volatile ） 字段，JMM 对这样的领域有什么保证？"></a>Q10: 什么是易失 （ volatile ） 字段，JMM 对这样的领域有什么保证？</h2><p>根据 Java 内存模型 （ 参见 Q9 ） ，<code>volatile</code> 字段具有特殊属性。<code>volatile</code> 变量的读取和写入是同步操作，这意味着它们具有总排序（ 所有线程将遵循这些操作的一致顺序 ）。根据此顺序，保证读取 volatile 变量可以观察到对此变量的最后一次写入。</p><p>如果你有一个从多个线程访问的字段，且至少有一个线程写入它，那么你应该考虑使它变得 <code>volatile</code> ，否则某个线程从这个字段读取的内容并不会得到一丝的保证。</p><p><code>volatile</code> 的另一个保证是写入和读取 64 位值（ <code>long</code> 类型和 <code>double</code> 类型 ）的原子性。如果没有 <code>volatile</code> 修饰符，读取此类字段可能会观察到另一个线程部分写入的值。</p><h2 id="Q11-以下哪项操作是原子操作"><a href="#Q11-以下哪项操作是原子操作" class="headerlink" title="Q11: 以下哪项操作是原子操作 ?"></a>Q11: 以下哪项操作是原子操作 ?</h2><ul><li>写入一个非 volatile int 类型</li><li>写入一个 volatile int 类型</li><li>写入一个非 volatile long 类型</li><li>写入一个 volatile long 类型</li><li>递增一个 volatile long 类型</li></ul><p>是不是瞬间蒙了？我们来解释一下</p><p>1、对 int 类型（ 32位 ）变量的写入保证是原子的，无论它是否是易失性的。<br>2、long 类型（ 64位 ）变量可能需要在两个单独的步骤中写入，例如，在 32 位体系结构上，因此默认情况下，没有原子性保证。但是，如果添加了 <code>volatile</code> 修饰符，则保证以原子方式访问 long 变量。<br>3、递增操作通常由多个步骤完成（ 检索值，更改它并写回 ），因此它永远不会保证是原子的，变量是易变的。如果要实现值的原子增量，则应使用类<code>AtomicInteger</code>， <code>AtomicLong</code> 等。</p><h2 id="Q12-JMM-对添加了-final-修饰符的类的字段有什么特殊保证-？"><a href="#Q12-JMM-对添加了-final-修饰符的类的字段有什么特殊保证-？" class="headerlink" title="Q12: JMM 对添加了 final 修饰符的类的字段有什么特殊保证 ？"></a>Q12: JMM 对添加了 <code>final</code> 修饰符的类的字段有什么特殊保证 ？</h2><p>JVM 基本上会保证在任何线程获取对象之前初始化类的 <code>final</code> 字段。</p><p>如果没有这种保证，由于重新排序或其他优化，在初始化该对象的所有字段之前，可以向另一个线程发布对象的引用，即变得可见。这可能会导致对这些字段的访问。</p><p>这就是为什么在创建不可变对象时，应始终将其所有字段设为 <code>final</code>，即使它们不能通过 getter 方法访问。</p><h2 id="Q13-方法定义中-synchronized-关键字的含义是什么？静态方法？在一个块之前-？"><a href="#Q13-方法定义中-synchronized-关键字的含义是什么？静态方法？在一个块之前-？" class="headerlink" title="Q13: 方法定义中 synchronized 关键字的含义是什么？静态方法？在一个块之前 ？"></a>Q13: 方法定义中 synchronized 关键字的含义是什么？静态方法？在一个块之前 ？</h2><p>块 ( block ) 之前的 synchronized 关键字表示进入该块的任何线程都必须获取监视器（ 括号中的对象 ）。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">synchronized</span>(object) &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br><span class="line">``</span><br><span class="line"></span><br><span class="line">如果监视器已被另一个线程获取，则前一个线程将进入 BLOCKED 状态并等待监视器被释放。</span><br><span class="line"></span><br><span class="line">同步实例方法具有相同的语义，但会使用实例本身充当监视器。</span><br><span class="line"></span><br><span class="line">```java</span><br><span class="line"><span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title function_">instanceMethod</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>对于静态同步方法，监视器是表示声明类的 Class 对象。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">static</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title function_">staticMethod</span><span class="params">()</span> &#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Q14-如果两个线程同时在不同的对象实例上调用-synchronized-方法，这些线程中的一个是否会阻塞？如果该方法是静态的，该怎么办"><a href="#Q14-如果两个线程同时在不同的对象实例上调用-synchronized-方法，这些线程中的一个是否会阻塞？如果该方法是静态的，该怎么办" class="headerlink" title="Q14: 如果两个线程同时在不同的对象实例上调用 synchronized 方法，这些线程中的一个是否会阻塞？如果该方法是静态的，该怎么办?"></a>Q14: 如果两个线程同时在不同的对象实例上调用 synchronized 方法，这些线程中的一个是否会阻塞？如果该方法是静态的，该怎么办?</h2><p>如果方法是实例方法，则实例充当方法的监视器。在不同实例上调用该方法的两个线程获取不同的监视器，因此它们都不会被阻塞。</p><p>如果方法是静态的，则监视器是 <code>Class</code> 对象。对于两个线程，监视器是相同的，因此其中一个可能会阻塞并等待另一个退出 <code>synchronized</code> 方法。</p><h2 id="Q15-Object类的-wait，notify-和-notifyAll-方法的目的是什么-？"><a href="#Q15-Object类的-wait，notify-和-notifyAll-方法的目的是什么-？" class="headerlink" title="Q15: Object类的 wait，notify 和 notifyAll 方法的目的是什么 ？"></a>Q15: Object类的 wait，notify 和 notifyAll 方法的目的是什么 ？</h2><p>拥有对象监视器的线程（ 例如，已进入由对象保护的同步部分的线程 ）可以调用 <code>object.wait()</code> 来临时释放监视器并为其他线程提供获取监视器的机会。例如，这可以在等待某个条件的情况下完成。</p><p>当另一个获取监视器的线程满足条件时，它可以调用 <code>object.notify()</code> 或 <code>object.notifyAll()</code> 并释放监视器。<code>notify()</code> 方法唤醒处于等待状态的单个线程，<code>notifyAll()</code> 方法唤醒等待此监视器的所有线程，并且它们都竞争重新获取锁定。</p><p>下面的 BlockingQueue 实现演示了多个线程如何通过 <code>wait-notify</code> 模式一起工作。如果我们将一个元素放入一个空队列，那么在 <code>take()</code> 方法中等待的所有线程都会唤醒并尝试接收该值。如果我们将一个元素放入一个已经满了的队列，<code>put()</code> 方法将等待对 <code>get()</code> 方法的调用。<code>get()</code> 方法删除一个元素，并通知在 <code>put()</code> 方法中等待队列对新项目有空位置的线程。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BlockingQueue</span>&lt;T&gt; &#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> List&lt;T&gt; queue = <span class="keyword">new</span> <span class="title class_">LinkedList</span>&lt;T&gt;();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="type">int</span> <span class="variable">limit</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title function_">put</span><span class="params">(T item)</span> &#123;</span><br><span class="line">        <span class="keyword">while</span> (queue.size() == limit) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                wait();</span><br><span class="line">            &#125; <span class="keyword">catch</span> (InterruptedException e) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (queue.isEmpty()) &#123;</span><br><span class="line">            notifyAll();</span><br><span class="line">        &#125;</span><br><span class="line">        queue.add(item);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">synchronized</span> T <span class="title function_">take</span><span class="params">()</span> <span class="keyword">throws</span> InterruptedException &#123;</span><br><span class="line">        <span class="keyword">while</span> (queue.isEmpty()) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                wait();</span><br><span class="line">            &#125; <span class="keyword">catch</span> (InterruptedException e) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (queue.size() == limit) &#123;</span><br><span class="line">            notifyAll();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> queue.remove(<span class="number">0</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Q16-描述死锁，存活锁和饥饿的条件。描述这些情况的可能原因"><a href="#Q16-描述死锁，存活锁和饥饿的条件。描述这些情况的可能原因" class="headerlink" title="Q16: 描述死锁，存活锁和饥饿的条件。描述这些情况的可能原因 ?"></a>Q16: 描述死锁，存活锁和饥饿的条件。描述这些情况的可能原因 ?</h2><ul><li>死锁 （ <code>DeadLock</code> ） 是一组无法进行的线程中的条件，因为组中的每个线程都必须获取已由组中的另一个线程获取的某些资源。最简单的情况是两个线程需要锁定两个资源才能进行，第一个资源已被一个线程锁定，第二个资源已被另一个线程锁定。因为这些线程永远不会获得对两个资源的锁定，因此永远不会进展。</li><li>存活锁 ( <code>LiveLock</code> ) 是多线程对自己生成的条件或事件做出反应的一种情况。事件发生在一个线程中，必须由另一个线程处理。在此处理期间，发生的新事件必须在第一个线程中处理，依此类推。这样的线程是活着的并且没有被阻挡，但是仍然没有取得任何进展，因为它们用无用的工作压倒了对方</li><li>饥饿锁 ( <code>Starvation</code> ) 是线程无法获取资源的情况，因为其他线程（或多个线程）占用它太长时间或具有更高的优先级。线程无法取得进展，因此无法完成有用的工作。</li></ul><h2 id="Q17-描述-fork-join-框架的用途和用例"><a href="#Q17-描述-fork-join-框架的用途和用例" class="headerlink" title="Q17: 描述 fork&#x2F;join 框架的用途和用例"></a>Q17: 描述 fork&#x2F;join 框架的用途和用例</h2><p>fork&#x2F;join 框架允许并行化递归算法。使用 ThreadPoolExecutor 之类的并行递归的主要问题是，可能会快速耗尽线程，因为每个递归步骤都需要自己的线程，而堆栈中的线程将处于空闲状态并等待。</p><p>fork&#x2F;join 框架入口点是 ForkJoinPool 类，它是 ExecutorService 的一个实现。它实现了工作窃取算法，空闲线程会试图从忙线程中 「 窃取 」 工作。这允许在不同线程之间传播计算并在使用比通常的线程池所需的更少的线程时取得进展</p></article><div class="post-copyright"><div class="copyright-cc-box"><i class="anzhiyufont anzhiyu-icon-copyright"></i></div><div class="post-copyright__author_box"><a class="post-copyright__author_img" href="/" title="头像"><img class="post-copyright__author_img_back" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://q1.qlogo.cn/g?b=qq&amp;nk=2071916845&amp;s=640" title="头像" alt="头像"><img class="post-copyright__author_img_front" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://q1.qlogo.cn/g?b=qq&amp;nk=2071916845&amp;s=640" title="头像" alt="头像"></a><div class="post-copyright__author_name">云少</div><div class="post-copyright__author_desc">站在巨人的肩膀罢了</div></div><div class="post-copyright__post__info"><a class="post-copyright__original" title="该文章为原创文章，注意版权协议" href="https://it985.github.io/posts/774c589b.html">原创</a><a class="post-copyright-title"><span onclick='rm.copyPageUrl("https://it985.github.io/posts/774c589b.html")'>十、Java并发系列之 Java 并发编程面试题</span></a></div><div class="post-tools" id="post-tools"><div class="post-tools-left"><div class="rewardLeftButton"><div class="post-reward" onclick="anzhiyu.addRewardMask()"><div class="reward-button button--animated" title="赞赏作者"><i class="anzhiyufont anzhiyu-icon-hand-heart-fill"></i>打赏作者</div><div class="reward-main"><div class="reward-all"><span class="reward-title">感谢你赐予我前进的力量</span><ul class="reward-group"><li class="reward-item"><a href="/img/wxpay.webp" target="_blank"><img class="post-qr-code-img" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="/img/wxpay.webp" alt="wechat"></a><div class="post-qr-code-desc">wechat</div></li><li class="reward-item"><a href="/img/alipay.webp" target="_blank"><img class="post-qr-code-img" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="/img/alipay.webp" alt="alipay"></a><div class="post-qr-code-desc">alipay</div></li></ul><a class="reward-main-btn" href="/about/#about-reward" target="_blank"><div class="reward-text">赞赏者名单</div><div class="reward-dec">因为你们的支持让我意识到写文章的价值🙏</div></a></div></div></div><div id="quit-box" onclick="anzhiyu.removeRewardMask()" style="display:none"></div></div><div class="shareRight"><div class="share-link mobile"><div class="share-qrcode"><div class="share-button" title="使用手机访问这篇文章"><i class="anzhiyufont anzhiyu-icon-qrcode"></i></div><div class="share-main"><div class="share-main-all"><div id="qrcode" title="https://it985.github.io/posts/774c589b.html"></div><div class="reward-dec">使用手机访问这篇文章</div></div></div></div></div><div class="share-link weibo"><a class="share-button" target="_blank" href="https://service.weibo.com/share/share.php?title=十、Java并发系列之 Java 并发编程面试题&amp;url=https://it985.github.io/posts/774c589b.html&amp;pic=https://cn.bing.com/th?id=OHR.LimerickDay_EN-US4512689467_UHD.jpg" rel="external nofollow noreferrer noopener"><i class="anzhiyufont anzhiyu-icon-weibo"></i></a></div><div class="share-link copyurl"><div class="share-button" id="post-share-url" title="复制链接" onclick="rm.copyPageUrl()"><i class="anzhiyufont anzhiyu-icon-link"></i></div></div></div></div></div><div class="post-copyright__notice"><span class="post-copyright-info">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="external nofollow noreferrer" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="https://it985.github.io" target="_blank">云少IT</a>！</span></div></div><div class="post-tools-right"><div class="tag_share"><div class="post-meta__box"><div class="post-meta__box__category-list"><a class="post-meta__box__categoryes" href="/categories/Java/"><span class="categoryes-punctuation"><i class="anzhiyufont anzhiyu-icon-inbox"></i></span>Java<span class="categoryesPageCount">100</span></a></div><div class="post-meta__box__tag-list"><a class="post-meta__box__tags" href="/tags/Java%E5%B9%B6%E5%8F%91/"><span class="tags-punctuation"><i class="anzhiyufont anzhiyu-icon-tag"></i></span>Java并发<span class="tagsPageCount">20</span></a><a class="post-meta__box__tags" href="/tags/%E9%9D%A2%E8%AF%95/"><span class="tags-punctuation"> <i class="anzhiyufont anzhiyu-icon-tag"></i></span>面试<span class="tagsPageCount">11</span></a></div></div><div class="post_share"><div class="social-share" data-image="https://img02.anheyu.com/adminuploads/1/2022/09/05/6315e146a8bbd.webp" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.cbd.int/butterfly-extsrc@1.1.3/sharejs/dist/css/share.min.css" media="print" onload='this.media="all"'><script src="https://cdn.cbd.int/butterfly-extsrc@1.1.3/sharejs/dist/js/social-share.min.js" defer></script></div></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/posts/47722b62.html"><img class="prev-cover" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cn.bing.com/th?id=OHR.GrinnellGlacier_EN-US4427090483_UHD.jpg" onerror='onerror=null,src="/img/404.jpg"' alt="cover of previous post"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">九、Java并发 Java CompletableFuture ( 下 )</div></div></a></div><div class="next-post pull-right"><a href="/posts/92030527.html"><img class="next-cover" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cn.bing.com/th?id=OHR.ParanalStars_EN-US4851647464_UHD.jpg" onerror='onerror=null,src="/img/404.jpg"' alt="cover of next post"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">十一、Java并发 Java CountDownLatch</div></div></a></div></nav><div class="relatedPosts"><div class="headline"><i class="anzhiyufont anzhiyu-icon-thumbs-up fa-fw" style="font-size:1.5rem;margin-right:4px"></i><span>喜欢这篇文章的人也看了</span></div><div class="relatedPosts-list"><div><a href="/posts/cbf48f4a.html" title="十大经典排序算法之冒泡排序"><img class="cover" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cn.bing.com/th?id=OHR.GreatTits_EN-US6474534267_UHD.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="anzhiyufont anzhiyu-icon-calendar-days fa-fw"></i> 2019-03-02</div><div class="title">十大经典排序算法之冒泡排序</div></div></a></div><div><a href="/posts/2b1d309b.html" title="十九、Java并发 Java wait() 和 notify() 方法"><img class="cover" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cn.bing.com/th?id=OHR.WomensMemorial_EN-US8561851319_UHD.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="anzhiyufont anzhiyu-icon-calendar-days fa-fw"></i> 2018-09-19</div><div class="title">十九、Java并发 Java wait() 和 notify() 方法</div></div></a></div><div><a href="/posts/c969ad4b.html" title="十八、Java并发 Java 之 Runnable 还是 Thread ?"><img class="cover" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cn.bing.com/th?id=OHR.RedAlley_EN-US8215991251_UHD.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="anzhiyufont anzhiyu-icon-calendar-days fa-fw"></i> 2018-09-18</div><div class="title">十八、Java并发 Java 之 Runnable 还是 Thread ?</div></div></a></div><div><a href="/posts/9c8c1a2d.html" title="十七、Java并发 Java Thread 生命周期"><img class="cover" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cn.bing.com/th?id=OHR.ICanHearIt_EN-US7945824197_UHD.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="anzhiyufont anzhiyu-icon-calendar-days fa-fw"></i> 2018-09-17</div><div class="title">十七、Java并发 Java Thread 生命周期</div></div></a></div><div><a href="/posts/9c264667.html" title="十六、Java并发 Java ThreadLocalRandom"><img class="cover" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cn.bing.com/th?id=OHR.TowelDay_EN-US7748070759_UHD.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="anzhiyufont anzhiyu-icon-calendar-days fa-fw"></i> 2018-09-16</div><div class="title">十六、Java并发 Java ThreadLocalRandom</div></div></a></div><div><a href="/posts/50778af3.html" title="十五、Java并发 Java java.util.concurrent.Future"><img class="cover" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cn.bing.com/th?id=OHR.RoseRoom_EN-US7194472524_UHD.jpg" alt="cover"><div class="content is-center"><div class="date"><i class="anzhiyufont anzhiyu-icon-calendar-days fa-fw"></i> 2018-09-15</div><div class="title">十五、Java并发 Java java.util.concurrent.Future</div></div></a></div></div></div><hr><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="anzhiyufont anzhiyu-icon-comments"></i><span> 评论</span></div><div class="comment-randomInfo"><a onclick="anzhiyu.addRandomCommentInfo()" href="javascript:void(0)" rel="external nofollow noreferrer">匿名评论</a><a href="/privacy" style="margin-left:4px">隐私政策</a></div><div class="comment-switch"><span class="first-comment">Twikoo</span><span id="switch-btn"></span><span class="second-comment">Artalk</span></div><div class="comment-tips" id="comment-tips"><span>✅ 你无需删除空行，直接评论以获取最佳展示效果</span></div></div><div class="comment-wrap"><div><div id="twikoo-wrap"></div></div><div><div id="artalk-wrap"></div></div></div></div><div class="comment-barrage"></div></div><div class="aside-content" id="aside-content"><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="anzhiyufont anzhiyu-icon-bars"></i><span>文章目录</span><span class="toc-percentage"></span></div><div class="toc-content is-expand"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%8D%81%E3%80%81Java%E5%B9%B6%E5%8F%91%E7%B3%BB%E5%88%97%E4%B9%8B-Java-%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%E9%9D%A2%E8%AF%95%E9%A2%98"><span class="toc-number">1.</span> <span class="toc-text">十、Java并发系列之 Java 并发编程面试题</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#Q1-%E8%BF%9B%E7%A8%8B%E5%92%8C%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F"><span class="toc-number">1.1.</span> <span class="toc-text">Q1: 进程和线程的区别？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q2-%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E5%AE%9E%E4%BE%8B%E5%B9%B6%E4%B8%94%E8%BF%90%E8%A1%8C%E5%AE%83%EF%BC%9F"><span class="toc-number">1.2.</span> <span class="toc-text">Q2: 如何创建一个线程实例并且运行它？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q3-%E6%8F%8F%E8%BF%B0%E7%BA%BF%E7%A8%8B%E7%9A%84%E4%B8%8D%E5%90%8C%E7%8A%B6%E6%80%81%E4%BB%A5%E5%8F%8A%E4%BD%95%E6%97%B6%E5%8F%91%E7%94%9F%E7%8A%B6%E6%80%81%E8%BD%AC%E6%8D%A2-%EF%BC%9F"><span class="toc-number">1.3.</span> <span class="toc-text">Q3: 描述线程的不同状态以及何时发生状态转换 ？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q4-Runnable-%E5%92%8C-Callable-%E6%8E%A5%E5%8F%A3%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F%E5%AE%83%E4%BB%AC%E6%98%AF%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%9A%84%EF%BC%9F"><span class="toc-number">1.4.</span> <span class="toc-text">Q4: Runnable 和 Callable 接口有什么区别？它们是如何使用的？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q5-%E4%BB%80%E4%B9%88%E6%98%AF%E5%AE%88%E6%8A%A4%E7%BA%BF%E7%A8%8B%EF%BC%8C%E5%AE%83%E7%9A%84%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%AE%88%E6%8A%A4%E7%BA%BF%E7%A8%8B-%EF%BC%9F"><span class="toc-number">1.5.</span> <span class="toc-text">Q5: 什么是守护线程，它的使用场景是什么？如何创建守护线程 ？</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%A2%9D%E5%A4%96%E7%9A%84"><span class="toc-number">1.5.1.</span> <span class="toc-text">额外的</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q6-%E4%BB%80%E4%B9%88%E6%98%AF-Thread-%E7%9A%84%E4%B8%AD%E6%96%AD%E6%A0%87%E5%BF%97%EF%BC%9F%E6%80%8E%E4%B9%88%E8%AE%BE%E7%BD%AE%E5%92%8C%E6%A3%80%E6%9F%A5%E5%AE%83%EF%BC%9F%E5%AE%83%E4%B8%8E-InterruptedException-%E6%9C%89%E4%BB%80%E4%B9%88%E5%85%B3%E7%B3%BB%EF%BC%9F"><span class="toc-number">1.6.</span> <span class="toc-text">Q6: 什么是 Thread 的中断标志？怎么设置和检查它？它与 InterruptedException 有什么关系？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q7-%E4%BB%80%E4%B9%88%E6%98%AF-Executor-%E5%92%8C-ExecutorService-%EF%BC%9F%E8%BF%99%E4%B8%A4%E4%B8%AA%E6%8E%A5%E5%8F%A3%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F"><span class="toc-number">1.7.</span> <span class="toc-text">Q7: 什么是 Executor 和 ExecutorService ？这两个接口有什么区别？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q8-java-util-concurrent-%E6%A0%87%E5%87%86%E5%BA%93%E4%B8%AD-ExecutorService-%E7%9A%84%E5%8F%AF%E7%94%A8%E5%AE%9E%E7%8E%B0%E6%98%AF%E4%BB%80%E4%B9%88-%EF%BC%9F"><span class="toc-number">1.8.</span> <span class="toc-text">Q8: java.util.concurrent 标准库中 ExecutorService 的可用实现是什么 ？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q9-%E4%BB%80%E4%B9%88%E6%98%AF-Java-%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B%EF%BC%88-JMM-%EF%BC%89%EF%BC%9F%E6%8F%8F%E8%BF%B0%E4%B8%8B%E5%85%B6%E7%9B%AE%E7%9A%84%E5%92%8C%E5%9F%BA%E6%9C%AC%E6%80%9D%E6%83%B3"><span class="toc-number">1.9.</span> <span class="toc-text">Q9: 什么是 Java 内存模型（ JMM ）？描述下其目的和基本思想</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q10-%E4%BB%80%E4%B9%88%E6%98%AF%E6%98%93%E5%A4%B1-%EF%BC%88-volatile-%EF%BC%89-%E5%AD%97%E6%AE%B5%EF%BC%8CJMM-%E5%AF%B9%E8%BF%99%E6%A0%B7%E7%9A%84%E9%A2%86%E5%9F%9F%E6%9C%89%E4%BB%80%E4%B9%88%E4%BF%9D%E8%AF%81%EF%BC%9F"><span class="toc-number">1.10.</span> <span class="toc-text">Q10: 什么是易失 （ volatile ） 字段，JMM 对这样的领域有什么保证？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q11-%E4%BB%A5%E4%B8%8B%E5%93%AA%E9%A1%B9%E6%93%8D%E4%BD%9C%E6%98%AF%E5%8E%9F%E5%AD%90%E6%93%8D%E4%BD%9C"><span class="toc-number">1.11.</span> <span class="toc-text">Q11: 以下哪项操作是原子操作 ?</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q12-JMM-%E5%AF%B9%E6%B7%BB%E5%8A%A0%E4%BA%86-final-%E4%BF%AE%E9%A5%B0%E7%AC%A6%E7%9A%84%E7%B1%BB%E7%9A%84%E5%AD%97%E6%AE%B5%E6%9C%89%E4%BB%80%E4%B9%88%E7%89%B9%E6%AE%8A%E4%BF%9D%E8%AF%81-%EF%BC%9F"><span class="toc-number">1.12.</span> <span class="toc-text">Q12: JMM 对添加了 final 修饰符的类的字段有什么特殊保证 ？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q13-%E6%96%B9%E6%B3%95%E5%AE%9A%E4%B9%89%E4%B8%AD-synchronized-%E5%85%B3%E9%94%AE%E5%AD%97%E7%9A%84%E5%90%AB%E4%B9%89%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%9F%E5%9C%A8%E4%B8%80%E4%B8%AA%E5%9D%97%E4%B9%8B%E5%89%8D-%EF%BC%9F"><span class="toc-number">1.13.</span> <span class="toc-text">Q13: 方法定义中 synchronized 关键字的含义是什么？静态方法？在一个块之前 ？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q14-%E5%A6%82%E6%9E%9C%E4%B8%A4%E4%B8%AA%E7%BA%BF%E7%A8%8B%E5%90%8C%E6%97%B6%E5%9C%A8%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AF%B9%E8%B1%A1%E5%AE%9E%E4%BE%8B%E4%B8%8A%E8%B0%83%E7%94%A8-synchronized-%E6%96%B9%E6%B3%95%EF%BC%8C%E8%BF%99%E4%BA%9B%E7%BA%BF%E7%A8%8B%E4%B8%AD%E7%9A%84%E4%B8%80%E4%B8%AA%E6%98%AF%E5%90%A6%E4%BC%9A%E9%98%BB%E5%A1%9E%EF%BC%9F%E5%A6%82%E6%9E%9C%E8%AF%A5%E6%96%B9%E6%B3%95%E6%98%AF%E9%9D%99%E6%80%81%E7%9A%84%EF%BC%8C%E8%AF%A5%E6%80%8E%E4%B9%88%E5%8A%9E"><span class="toc-number">1.14.</span> <span class="toc-text">Q14: 如果两个线程同时在不同的对象实例上调用 synchronized 方法，这些线程中的一个是否会阻塞？如果该方法是静态的，该怎么办?</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q15-Object%E7%B1%BB%E7%9A%84-wait%EF%BC%8Cnotify-%E5%92%8C-notifyAll-%E6%96%B9%E6%B3%95%E7%9A%84%E7%9B%AE%E7%9A%84%E6%98%AF%E4%BB%80%E4%B9%88-%EF%BC%9F"><span class="toc-number">1.15.</span> <span class="toc-text">Q15: Object类的 wait，notify 和 notifyAll 方法的目的是什么 ？</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q16-%E6%8F%8F%E8%BF%B0%E6%AD%BB%E9%94%81%EF%BC%8C%E5%AD%98%E6%B4%BB%E9%94%81%E5%92%8C%E9%A5%A5%E9%A5%BF%E7%9A%84%E6%9D%A1%E4%BB%B6%E3%80%82%E6%8F%8F%E8%BF%B0%E8%BF%99%E4%BA%9B%E6%83%85%E5%86%B5%E7%9A%84%E5%8F%AF%E8%83%BD%E5%8E%9F%E5%9B%A0"><span class="toc-number">1.16.</span> <span class="toc-text">Q16: 描述死锁，存活锁和饥饿的条件。描述这些情况的可能原因 ?</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#Q17-%E6%8F%8F%E8%BF%B0-fork-join-%E6%A1%86%E6%9E%B6%E7%9A%84%E7%94%A8%E9%80%94%E5%92%8C%E7%94%A8%E4%BE%8B"><span class="toc-number">1.17.</span> <span class="toc-text">Q17: 描述 fork&#x2F;join 框架的用途和用例</span></a></li></ol></li></ol></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div id="footer_deal"><a class="deal_link" href="mailto:2071916845@qq.com" rel="external nofollow noreferrer" title="email"><i class="anzhiyufont anzhiyu-icon-envelope"></i></a><a class="deal_link" target="_blank" rel="noopener external nofollow noreferrer" href="https://weibo.com/" title="微博"><i class="anzhiyufont anzhiyu-icon-weibo"></i></a><a class="deal_link" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.facebook.com/" title="facebook"><i class="anzhiyufont anzhiyu-icon-facebook1"></i></a><a class="deal_link" href="/atom.xml" title="RSS"><i class="anzhiyufont anzhiyu-icon-rss"></i></a><img class="footer_mini_logo" title="返回顶部" alt="返回顶部" onclick="anzhiyu.scrollToDest(0,500)" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://q1.qlogo.cn/g?b=qq&amp;nk=2071916845&amp;s=640" size="50px"><a class="deal_link" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/it985" title="Github"><i class="anzhiyufont anzhiyu-icon-github"></i></a><a class="deal_link" target="_blank" rel="noopener external nofollow noreferrer" href="https://space.bilibili.com/300767383" title="Bilibili"><i class="anzhiyufont anzhiyu-icon-bilibili"></i></a><a class="deal_link" target="_blank" rel="noopener external nofollow noreferrer" href="https://v.douyin.com/" title="抖音"><i class="anzhiyufont anzhiyu-icon-tiktok"></i></a><a class="deal_link" href="/copyright" title="CC"><i class="anzhiyufont anzhiyu-icon-copyright-line"></i></a></div><div id="anzhiyu-footer"><div class="footer-group"><div class="footer-title">服务</div><div class="footer-links"><a class="footer-item" title="51la统计" target="_blank" rel="noopener external nofollow noreferrer" href="https://v6.51.la/">51la统计</a><a class="footer-item" title="十年之约" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.foreverblog.cn/">十年之约</a><a class="footer-item" title="开往" target="_blank" rel="noopener external nofollow noreferrer" href="https://github.com/travellings-link/travellings">开往</a></div></div><div class="footer-group"><div class="footer-title">导航</div><div class="footer-links"><a class="footer-item" title="即刻短文" href="/essay/">即刻短文</a><a class="footer-item" title="友链文章" href="/fcircle/">友链文章</a><a class="footer-item" title="留言板" href="/comments/">留言板</a></div></div><div class="footer-group"><div class="footer-title">协议</div><div class="footer-links"><a class="footer-item" title="免责声明" href="/disclaimer/">免责声明</a><a class="footer-item" title="隐私协议" href="/privacy/">隐私协议</a><a class="footer-item" title="Cookies" href="/cookies/">Cookies</a><a class="footer-item" title="版权协议" href="/copyright/">版权协议</a></div></div><div class="footer-group"><div class="footer-title">娱乐</div><div class="footer-links"><a class="footer-item" title="小空调" href="/air-conditioner/">小空调</a><a class="footer-item" title="围住小猫" href="/catch-cat/">围住小猫</a><a class="footer-item" title="免费图床" href="/huluxiapicture/">免费图床</a></div></div><div class="footer-group"><div class="footer-title">推荐分类</div><div class="footer-links"><a class="footer-item" title="Java" href="/categories/Java/">Java</a><a class="footer-item" title="面试" href="/categories/%E9%9D%A2%E8%AF%95/">面试</a></div></div><div class="footer-group"><div class="footer-title-group"><div class="footer-title">友链</div><a class="random-friends-btn" id="footer-random-friends-btn" href="javascript:addFriendLinksInFooter();" rel="external nofollow noreferrer" title="换一批友情链接"><i class="anzhiyufont anzhiyu-icon-arrow-rotate-right"></i></a></div><div class="footer-links" id="friend-links-in-footer"></div></div></div><div id="workboard"><img class="workSituationImg boardsign" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-上班摸鱼中.svg" alt="距离月入25k也就还差一个大佬带我~" title="距离月入25k也就还差一个大佬带我~"><div id="runtimeTextTip"></div></div><div class="wordcount"></div><span>云少已经写了 996.7k 字，</span><span>好像写完一本我国著名的 四大名著 了！！！</span><p id="ghbdages"><a class="github-badge" target="_blank" href="https://hexo.io/" rel="external nofollow noreferrer" style="margin-inline:5px" data-title="博客框架为Hexo_v5.4.0" title="博客框架为Hexo_v5.4.0"><img src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Frame-Hexo.svg" alt="博客框架为Hexo_v5.4.0"></a><a class="github-badge" target="_blank" href="https://www.upyun.com/?utm_source=lianmeng&amp;utm_medium=referral" rel="external nofollow noreferrer" style="margin-inline:5px" data-title="本站使用又拍云为静态资源提供CDN加速" title="本站使用又拍云为静态资源提供CDN加速"><img src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://img.shields.io/badge/CDN-%E5%8F%88%E6%8B%8D%E4%BA%91-orange%3Fstyle%3Dflat%26logo%3D%E5%8F%88%E6%8B%8D%E4%BA%91" alt="本站使用又拍云为静态资源提供CDN加速"></a><a class="github-badge" target="_blank" href="https://github.com/" rel="external nofollow noreferrer" style="margin-inline:5px" data-title="本站项目由Github托管" title="本站项目由Github托管"><img src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Source-Github.svg" alt="本站项目由Github托管"></a><a class="github-badge" target="_blank" href="http://creativecommons.org/licenses/by-nc-sa/4.0/" rel="external nofollow noreferrer" style="margin-inline:5px" data-title="本站采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可" title="本站采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可"><img src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://npm.elemecdn.com/anzhiyu-blog@2.2.0/img/badge/Copyright-BY-NC-SA.svg" alt="本站采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可"></a><a class="github-badge" target="_blank" href="https://icp.gov.moe/?keyword=20221607" rel="external nofollow noreferrer" style="margin-inline:5px" data-title="萌ICP备20221607号" title="萌ICP备20221607号"><img src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://img.shields.io/badge/%E8%90%8CICP%E5%A4%87-20221607-fe1384?style-flat&amp;logo=" alt="萌ICP备20221607号"></a></p></div><div id="footer-bar"><div class="footer-bar-links"><div class="footer-bar-left"><div id="footer-bar-tips"><div class="copyright">&copy;2018 - 2023 By <a class="footer-bar-link" href="/" title="云少" target="_blank">云少</a></div></div><div id="footer-type-tips"></div><div class="js-pjax"><script>function subtitleType(){fetch("https://v1.hitokoto.cn").then(t=>t.json()).then(t=>{var e="出自 "+t.from,p=[];p.unshift(t.hitokoto,e),window.typed=new Typed("#footer-type-tips",{strings:p,startDelay:300,typeSpeed:150,loop:!0,backSpeed:50})})}"function"==typeof Typed?subtitleType():getScript("https://cdn.cbd.int/typed.js@2.0.15/dist/typed.umd.js").then(subtitleType)</script></div></div><div class="footer-bar-right"><a class="footer-bar-link" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.tryrun.top" title="云少">云少</a><a class="footer-bar-link" target="_blank" rel="noopener external nofollow noreferrer" href="https://beian.miit.gov.cn/" title="鄂ICP备2021021095号-2">鄂ICP备2021021095号-2</a><a class="footer-bar-link cc" href="/copyright" title="cc协议"><i class="anzhiyufont anzhiyu-icon-copyright-line"></i><i class="anzhiyufont anzhiyu-icon-creative-commons-by-line"></i><i class="anzhiyufont anzhiyu-icon-creative-commons-nc-line"></i><i class="anzhiyufont anzhiyu-icon-creative-commons-nd-line"></i></a></div></div></div></footer></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="sidebar-site-data site-data is-center"><a href="/archives/" title="archive"><div class="headline">文章</div><div class="length-num">861</div></a><a href="/tags/" title="tag"><div class="headline">标签</div><div class="length-num">35</div></a><a href="/categories/" title="category"><div class="headline">分类</div><div class="length-num">6</div></a></div><span class="sidebar-menu-item-title">功能</span><div class="sidebar-menu-item"><a class="darkmode_switchbutton menu-child" href="javascript:void(0);" rel="external nofollow noreferrer" title="显示模式"><i class="anzhiyufont anzhiyu-icon-circle-half-stroke"></i><span>显示模式</span></a></div><div class="back-menu-list-groups"><div class="back-menu-list-group"><div class="back-menu-list-title">网页</div><div class="back-menu-list"><a class="back-menu-item" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.tryrun.top/" title="博客"><img class="back-menu-item-icon" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="/img/favicon.ico" alt="博客"><span class="back-menu-item-text">博客</span></a></div></div><div class="back-menu-list-group"><div class="back-menu-list-title">项目</div><div class="back-menu-list"><a class="back-menu-item" target="_blank" rel="noopener external nofollow noreferrer" href="https://www.tryrun.top" title="图床"><img class="back-menu-item-icon" src= "" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://www.tryrun.top/favicon.ico" alt="图床"><span class="back-menu-item-text">图床</span></a></div></div></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><span>望四方</span></a><ul class="menus_item_child"><li><a class="site-page child faa-parent animated-hover" href="/archives/"><i class="anzhiyufont anzhiyu-icon-box-archive faa-tada" style="font-size:.9em"></i><span> 归名档</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/categories/"><i class="anzhiyufont anzhiyu-icon-shapes faa-tada" style="font-size:.9em"></i><span> 归四类</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/tags/"><i class="anzhiyufont anzhiyu-icon-tags faa-tada" style="font-size:.9em"></i><span> 书中签</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/charts/"><i class="fa-fw fas fa-chart-bar faa-tada"></i><span> 统计</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><span>友链</span></a><ul class="menus_item_child"><li><a class="site-page child faa-parent animated-hover" href="/link/"><i class="anzhiyufont anzhiyu-icon-link faa-tada" style="font-size:.9em"></i><span> 四方好友</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/fcircle/"><i class="anzhiyufont anzhiyu-icon-artstation faa-tada" style="font-size:.9em"></i><span> 朋友圈</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/comments/"><i class="anzhiyufont anzhiyu-icon-envelope faa-tada" style="font-size:.9em"></i><span> 留言板</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><span>我的</span></a><ul class="menus_item_child"><li><a class="site-page child faa-parent animated-hover" href="/bangumis/"><i class="anzhiyufont anzhiyu-icon-bilibili faa-tada" style="font-size:.9em"></i><span> 追番页</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/album/"><i class="anzhiyufont anzhiyu-icon-images faa-tada" style="font-size:.9em"></i><span> 刹那间</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/equipment/"><i class="fas fa-heart faa-tada"></i><span> 我的装备</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/collect/"><i class="fas fa-camcorder faa-tada"></i><span> 观影阁</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="javascript:void(0);" rel="external nofollow noreferrer"><span>关于</span></a><ul class="menus_item_child"><li><a class="site-page child faa-parent animated-hover" href="/about/"><i class="anzhiyufont anzhiyu-icon-paper-plane faa-tada" style="font-size:.9em"></i><span> 关于本人</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/essay/"><i class="anzhiyufont anzhiyu-icon-lightbulb faa-tada" style="font-size:.9em"></i><span> 闲言碎语</span></a></li><li><a class="site-page child faa-parent animated-hover" href="javascript:toRandomPost()" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-shoe-prints1 faa-tada" style="font-size:.9em"></i><span> 随便逛逛</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/disclaimer/"><i class="fas fa-heart faa-tada"></i><span> 免责声明</span></a></li><li><a class="site-page child faa-parent animated-hover" href="/love/"><i class="anzhiyufont anzhiyu-icon-heartbeat faa-tada" style="font-size:.9em"></i><span> 恋爱小屋</span></a></li></ul></div></div><span class="sidebar-menu-item-title">标签</span><div class="card-tags"><div class="item-headline"></div><div class="card-tag-cloud"><a href="/tags/API/" style="font-size:.88rem;color:#758692">API<sup>43</sup></a><a href="/tags/Base64/" style="font-size:.88rem;color:#2584bf">Base64<sup>1</sup></a><a href="/tags/Collectors/" style="font-size:.88rem;color:#bfad3e">Collectors<sup>3</sup></a><a href="/tags/Date/" style="font-size:.88rem;color:#b9b609">Date<sup>3</sup></a><a href="/tags/Executor/" style="font-size:.88rem;color:#14c83c">Executor<sup>9</sup></a><a href="/tags/Guava/" style="font-size:.88rem;color:#0a1878">Guava<sup>1</sup></a><a href="/tags/JVM/" style="font-size:.88rem;color:#625421">JVM<sup>8</sup></a><a href="/tags/Java8/" style="font-size:.88rem;color:#aa71bf">Java8<sup>21</sup></a><a href="/tags/Java9/" style="font-size:.88rem;color:#ad8774">Java9<sup>21</sup></a><a href="/tags/Java%E5%B9%B6%E5%8F%91/" style="font-size:.88rem;color:#19704c">Java并发<sup>20</sup></a><a href="/tags/Lambda/" style="font-size:.88rem;color:#7e5c78">Lambda<sup>4</sup></a><a href="/tags/Lock/" style="font-size:.88rem;color:#700769">Lock<sup>1</sup></a><a href="/tags/Maven/" style="font-size:.88rem;color:#2b8671">Maven<sup>1</sup></a><a href="/tags/Memcached/" style="font-size:.88rem;color:#1b0694">Memcached<sup>23</sup></a><a href="/tags/Mongodb/" style="font-size:.88rem;color:#36202d">Mongodb<sup>49</sup></a><a href="/tags/Queue/" style="font-size:.88rem;color:#643f76">Queue<sup>1</sup></a><a href="/tags/Redis/" style="font-size:.88rem;color:#1e4c38">Redis<sup>27</sup></a><a href="/tags/Stream/" style="font-size:.88rem;color:#a5a097">Stream<sup>4</sup></a><a href="/tags/Thread/" style="font-size:.88rem;color:#05682d">Thread<sup>7</sup></a><a href="/tags/Thread-pool/" style="font-size:.88rem;color:#38ad2a">Thread pool<sup>7</sup></a><a href="/tags/forkJoinPool/" style="font-size:.88rem;color:#827a6b">forkJoinPool<sup>2</sup></a><a href="/tags/stream/" style="font-size:.88rem;color:#4a3ac7">stream<sup>1</sup></a><a href="/tags/%E4%B8%93%E6%A0%8F/" style="font-size:.88rem;color:#b89c14">专栏<sup>35</sup></a><a href="/tags/%E4%BA%8B%E5%8A%A1/" style="font-size:.88rem;color:#922401">事务<sup>1</sup></a><a href="/tags/%E4%BC%98%E5%8C%96/" style="font-size:.88rem;color:#437d09">优化<sup>1</sup></a><a href="/tags/%E5%91%BD%E4%BB%A4/" style="font-size:.88rem;color:#705b06">命令<sup>57</sup></a><a href="/tags/%E5%AE%89%E8%A3%85/" style="font-size:.88rem;color:#06a544">安装<sup>6</sup></a><a href="/tags/%E5%B7%A5%E5%85%B7/" style="font-size:.88rem;color:#c86c4f">工具<sup>2</sup></a><a href="/tags/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/" style="font-size:.88rem;color:#560b2c">数据类型<sup>8</sup></a><a href="/tags/%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/" style="font-size:.88rem;color:#4e0a32">生命周期<sup>1</sup></a><a href="/tags/%E7%AE%80%E4%BB%8B/" style="font-size:.88rem;color:#230f8e">简介<sup>7</sup></a><a href="/tags/%E7%AE%97%E6%B3%95/" style="font-size:.88rem;color:#c0771e">算法<sup>10</sup></a><a href="/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/" style="font-size:.88rem;color:#b40caa">设计模式<sup>38</sup></a><a href="/tags/%E9%85%8D%E7%BD%AE/" style="font-size:.88rem;color:#67389a">配置<sup>2</sup></a><a href="/tags/%E9%9D%A2%E8%AF%95/" style="font-size:.88rem;color:#57425c">面试<sup>11</sup></a></div></div><hr></div></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="anzhiyufont anzhiyu-icon-book-open"></i></button><button id="translateLink" type="button" title="简繁转换">繁</button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="anzhiyufont anzhiyu-icon-circle-half-stroke"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="anzhiyufont anzhiyu-icon-arrows-left-right"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="anzhiyufont anzhiyu-icon-gear"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="anzhiyufont anzhiyu-icon-list-ul"></i></button><a id="to_comment" href="#post-comment" title="直达评论"><i class="anzhiyufont anzhiyu-icon-comments"></i></a><button type="button" title="切换背景" onclick="toggleWinbox()"><i class="fas fa-display"></i></button><button id="go-up" type="button" title="回到顶部"><i class="anzhiyufont anzhiyu-icon-arrow-up"></i></button></div></div><div id="algolia-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">搜索</span><button class="search-close-button"><i class="anzhiyufont anzhiyu-icon-xmark"></i></button></nav><div class="search-wrap"><div id="algolia-search-input"></div><hr><div id="algolia-search-results"><div id="algolia-hits"></div><div id="algolia-pagination"></div><div id="algolia-info"><div class="algolia-stats"></div><div class="algolia-poweredBy"></div></div></div></div></div><div id="search-mask"></div></div><div id="rightMenu"><div class="rightMenu-group rightMenu-small"><div class="rightMenu-item" id="menu-backward"><i class="anzhiyufont anzhiyu-icon-arrow-left"></i></div><div class="rightMenu-item" id="menu-forward"><i class="anzhiyufont anzhiyu-icon-arrow-right"></i></div><div class="rightMenu-item" id="menu-refresh"><i class="anzhiyufont anzhiyu-icon-arrow-rotate-right" style="font-size:1rem"></i></div><div class="rightMenu-item" id="menu-top"><i class="anzhiyufont anzhiyu-icon-arrow-up"></i></div></div><div class="rightMenu-group rightMenu-line rightMenuPlugin"><div class="rightMenu-item" id="menu-copytext"><i class="anzhiyufont anzhiyu-icon-copy"></i><span>复制选中文本</span></div><div class="rightMenu-item" id="menu-pastetext"><i class="anzhiyufont anzhiyu-icon-paste"></i><span>粘贴文本</span></div><a class="rightMenu-item" id="menu-commenttext"><i class="anzhiyufont anzhiyu-icon-comment-medical"></i><span>引用到评论</span></a><div class="rightMenu-item" id="menu-newwindow"><i class="anzhiyufont anzhiyu-icon-window-restore"></i><span>新窗口打开</span></div><div class="rightMenu-item" id="menu-copylink"><i class="anzhiyufont anzhiyu-icon-link"></i><span>复制链接地址</span></div><div class="rightMenu-item" id="menu-copyimg"><i class="anzhiyufont anzhiyu-icon-images"></i><span>复制此图片</span></div><div class="rightMenu-item" id="menu-downloadimg"><i class="anzhiyufont anzhiyu-icon-download"></i><span>下载此图片</span></div><div class="rightMenu-item" id="menu-newwindowimg"><i class="anzhiyufont anzhiyu-icon-window-restore"></i><span>新窗口打开图片</span></div><div class="rightMenu-item" id="menu-search"><i class="anzhiyufont anzhiyu-icon-magnifying-glass"></i><span>站内搜索</span></div><div class="rightMenu-item" id="menu-searchBaidu"><i class="anzhiyufont anzhiyu-icon-magnifying-glass"></i><span>百度搜索</span></div><div class="rightMenu-item" id="menu-music-toggle"><i class="anzhiyufont anzhiyu-icon-play"></i><span>播放音乐</span></div><div class="rightMenu-item" id="menu-music-back"><i class="anzhiyufont anzhiyu-icon-backward"></i><span>切换到上一首</span></div><div class="rightMenu-item" id="menu-music-forward"><i class="anzhiyufont anzhiyu-icon-forward"></i><span>切换到下一首</span></div><div class="rightMenu-item" id="menu-music-playlist" onclick="window.open(&quot;https://y.qq.com/n/ryqq/playlist/8802438608&quot;, &quot;_blank&quot;);" style="display:none"><i class="anzhiyufont anzhiyu-icon-radio"></i><span>查看所有歌曲</span></div><div class="rightMenu-item" id="menu-music-copyMusicName"><i class="anzhiyufont anzhiyu-icon-copy"></i><span>复制歌名</span></div></div><div class="rightMenu-group rightMenu-line rightMenuOther"><a class="rightMenu-item menu-link" id="menu-randomPost"><i class="anzhiyufont anzhiyu-icon-shuffle"></i><span>随便逛逛</span></a><a class="rightMenu-item menu-link" href="/categories/"><i class="anzhiyufont anzhiyu-icon-cube"></i><span>博客分类</span></a><a class="rightMenu-item menu-link" href="/tags/"><i class="anzhiyufont anzhiyu-icon-tags"></i><span>文章标签</span></a></div><div class="rightMenu-group rightMenu-line rightMenuOther"><a class="rightMenu-item" id="menu-copy" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-copy"></i><span>复制地址</span></a><a class="rightMenu-item" id="menu-commentBarrage" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-message"></i><span class="menu-commentBarrage-text">关闭热评</span></a><a class="rightMenu-item" id="menu-darkmode" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-circle-half-stroke"></i><span class="menu-darkmode-text">深色模式</span></a><a class="rightMenu-item" id="menu-translate" href="javascript:void(0);" rel="external nofollow noreferrer"><i class="anzhiyufont anzhiyu-icon-language"></i><span>轉為繁體</span></a></div></div><div id="rightmenu-mask"></div><div id="he-plugin-simple"></div><script>var WIDGET={CONFIG:{modules:"0124",background:"2",tmpColor:"FFFFFF",tmpSize:"16",cityColor:"FFFFFF",citySize:"16",aqiColor:"E8D87B",aqiSize:"16",weatherIconSize:"24",alertIconSize:"18",padding:"10px 10px 10px 10px",shadow:"0",language:"auto",borderRadius:"20",fixed:"true",vertical:"top",horizontal:"left",left:"20",top:"7.1",key:"df245676fb434a0691ead1c63341cd94"}}</script><link rel="stylesheet" href="https://widget.qweather.net/simple/static/css/he-simple.css?v=1.4.0"><script src="https://widget.qweather.net/simple/static/js/he-simple.js?v=1.4.0"></script><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="/js/tw_cn.js"></script><script src="https://cdn.cbd.int/@fancyapps/ui@5.0.20/dist/fancybox/fancybox.umd.js"></script><script src="https://cdn.cbd.int/instant.page@5.2.0/instantpage.js" type="module"></script><script src="https://cdn.cbd.int/vanilla-lazyload@17.8.4/dist/lazyload.iife.min.js"></script><script src="https://cdn.cbd.int/node-snackbar@0.1.16/dist/snackbar.min.js"></script><script>function panguFn(){"object"==typeof pangu?pangu.autoSpacingPage():getScript("https://cdn.cbd.int/pangu@4.0.7/dist/browser/pangu.min.js").then(()=>{pangu.autoSpacingPage()})}function panguInit(){panguFn()}document.addEventListener("DOMContentLoaded",panguInit)</script><script>var meting_api="https://api.injahow.cn/meting/?server=:server&type=:type&id=:id&auth=:auth&r=:r"</script><canvas id="universe"></canvas><script async src="https://npm.elemecdn.com/anzhiyu-theme-static@1.0.0/dark/dark.js"></script><script>var HoldLog=console.log;console.log=function(){};let now1=new Date;queueMicrotask(()=>{function o(){HoldLog.apply(console,arguments)}var c=new Date("09/01/2018 00:00:00"),c=(now1.setTime(now1.getTime()+250),(now1-c)/1e3/60/60/24),c=["欢迎使用安知鱼!","生活明朗, 万物可爱",`
        
       █████╗ ███╗   ██╗███████╗██╗  ██╗██╗██╗   ██╗██╗   ██╗
      ██╔══██╗████╗  ██║╚══███╔╝██║  ██║██║╚██╗ ██╔╝██║   ██║
      ███████║██╔██╗ ██║  ███╔╝ ███████║██║ ╚████╔╝ ██║   ██║
      ██╔══██║██║╚██╗██║ ███╔╝  ██╔══██║██║  ╚██╔╝  ██║   ██║
      ██║  ██║██║ ╚████║███████╗██║  ██║██║   ██║   ╚██████╔╝
      ╚═╝  ╚═╝╚═╝  ╚═══╝╚══════╝╚═╝  ╚═╝╚═╝   ╚═╝    ╚═════╝
        
        `,"已上线",Math.floor(c),"天","©2018 By 安知鱼 V1.6.6"],e=["NCC2-036","调用前置摄像头拍照成功，识别为【小笨蛋】.","Photo captured: ","🤪"];setTimeout(o.bind(console,`
%c${c[0]} %c ${c[1]} %c ${c[2]} %c${c[3]}%c ${c[4]}%c ${c[5]}

%c ${c[6]}
`,"color:#425AEF","","color:#425AEF","color:#425AEF","","color:#425AEF","")),setTimeout(o.bind(console,`%c ${e[0]} %c ${e[1]} %c 
${e[2]} %c
${e[3]}
`,"color:white; background-color:#4fd953","","",'background:url("https://npm.elemecdn.com/anzhiyu-blog@1.1.6/img/post/common/tinggge.gif") no-repeat;font-size:450%')),setTimeout(o.bind(console,"%c WELCOME %c 你好，小笨蛋.","color:white; background-color:#4f90d9","")),setTimeout(console.warn.bind(console,"%c ⚡ Powered by 安知鱼 %c 你正在访问 云少 的博客.","color:white; background-color:#f0ad4e","")),setTimeout(o.bind(console,"%c W23-12 %c 你已打开控制台.","color:white; background-color:#4f90d9","")),setTimeout(console.warn.bind(console,"%c S013-782 %c 你现在正处于监控中.","color:white; background-color:#d9534f",""))})</script><script async src="/anzhiyu/random.js"></script><script async>!function(){var n,o,r,a,i,e=new Date("09/01/2018 00:00:00"),l=new Date;setInterval(()=>{var t;if(l=new Date,i=l.getHours(),t=(l-e)/1e3/60/60/24,n=Math.floor(t),t=(l-e)/1e3/60/60-24*n,o=Math.floor(t),1==String(o).length&&(o="0"+o),t=(l-e)/1e3/60-1440*n-60*o,r=Math.floor(t),1==String(r).length&&(r="0"+r),t=(l-e)/1e3-86400*n-3600*o-60*r,a=Math.round(t),1==String(a).length&&(a="0"+a),document.getElementById("footer")){let e="";e=(i<18&&9<=i||((t=document.querySelector("#workboard .workSituationImg")).src="https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-下班啦.svg",t.title="下班了就该开开心心的玩耍，嘿嘿~",t.alt="下班了就该开开心心的玩耍，嘿嘿~"),`本站居然运行了 ${n} 天<span id='runtime'> ${o} 小时 ${r} 分 ${a} 秒 </span><i class='anzhiyufont anzhiyu-icon-heartbeat' style='color:red'></i>`),document.getElementById("runtimeTextTip")&&(document.getElementById("runtimeTextTip").innerHTML=e)}},1e3)}()</script><script src="https://cdn.cbd.int/algoliasearch@4.18.0/dist/algoliasearch-lite.umd.js"></script><script src="https://cdn.cbd.int/instantsearch.js@4.56.5/dist/instantsearch.production.min.js"></script><script src="/js/search/algolia.js"></script><div class="js-pjax"><script>(()=>{const e=document.querySelectorAll("#article-container .mermaid-wrap");if(0!==e.length){const n=()=>{window.loadMermaid=!0;const a="dark"===document.documentElement.getAttribute("data-theme")?"dark":"default";Array.from(e).forEach((e,t)=>{const n=e.firstElementChild;e="%%{init:{ 'theme':'"+a+"'}}%%\n"+n.textContent;const d=mermaid.render("mermaid-"+t,e);"string"==typeof d?(t=d,n.insertAdjacentHTML("afterend",t)):d.then(({svg:e})=>{n.insertAdjacentHTML("afterend",e)})})};var t=()=>{window.loadMermaid?n():getScript("https://cdn.cbd.int/mermaid@10.2.4/dist/mermaid.min.js").then(n)};anzhiyu.addGlobalFn("themeChange",n,"mermaid"),window.pjax?t():document.addEventListener("DOMContentLoaded",t)}})()</script><script>(()=>{const t=()=>{twikoo.init(Object.assign({el:"#twikoo-wrap",envId:"https://twikoo.tryrun.top/",region:"",onCommentLoaded:()=>{anzhiyu.loadLightbox(document.querySelectorAll("#twikoo .tk-content img:not(.tk-owo-emotion)"))}},null))};var o=()=>{"object"==typeof twikoo?setTimeout(n,0):getScript("https://cdn.cbd.int/twikoo@1.6.18/dist/twikoo.all.min.js").then(n)};const n=()=>{t()};anzhiyu.loadComment(document.getElementById("twikoo-wrap"),o)})()</script><script>(()=>{const t=()=>{window.artalkItem=new Artalk(Object.assign({el:"#artalk-wrap",server:"https://artalk.tryrun.top/",site:"https://blog.tryrun.top/",pageKey:location.pathname,darkMode:"dark"===document.documentElement.getAttribute("data-theme"),countEl:".artalk-count"},null)),"null"!==GLOBAL_CONFIG.lightbox&&window.artalkItem.use(t=>{t.on("list-loaded",()=>{t.getCommentList().forEach(t=>{t=t.getRender().$content;anzhiyu.loadLightbox(t.querySelectorAll("img:not([atk-emoticon])"))})})})};var a=async()=>{"object"==typeof window.artalkItem||(await getCSS("https://cdn.cbd.int/artalk@2.5.5/dist/Artalk.css"),await getScript("https://cdn.cbd.int/artalk@2.5.5/dist/Artalk.js")),t()};anzhiyu.addGlobalFn("themeChange",t=>{var a=document.getElementById("artalk-wrap");a&&a.children.length&&window.artalkItem.setDarkMode("dark"===t)},"artalk"),window.loadOtherComment=a})()</script><input type="hidden" name="page-type" id="page-type" value="post"></div><script>window.addEventListener("load",()=>{const t=e=>e=""!==e&&150<(e=(e=(e=(e=e.replace(/<img.*?src="(.*?)"?[^\>]+>/gi,"[图片]")).replace(/<a[^>]+?href=["']?([^"']+)["']?[^>]*>([^<]+)<\/a>/gi,"[链接]")).replace(/<pre><code>.*?<\/pre>/gi,"[代码]")).replace(/<[^>]+>/g,"")).length?e.substring(0,150)+"...":e,n=t=>{let n="";if(t.length)for(let e=0;e<t.length;e++)n=(n=(n+="<div class='aside-list-item'>")+`<a href='${t[e].url}' class='thumbnail'><img data-lazy-src='${t[e].avatar}' alt='${t[e].nick}'><div class='name'><span>${t[e].nick} </span></div></a>`)+`<div class='content'>
        <a class='comment' href='${t[e].url}' title='${t[e].content}'>${t[e].content}</a>
        <time datetime="${t[e].date}">${anzhiyu.diffDate(t[e].date,!0)}</time></div>
        </div>`;else n+="没有评论";var e=document.querySelector("#card-newest-comments .aside-list");e.innerHTML=n,window.lazyLoadInstance&&window.lazyLoadInstance.update(),window.pjax&&window.pjax.refresh(e)};var e=()=>{var e;document.querySelector("#card-newest-comments .aside-list")&&((e=saveToLocal.get("twikoo-newest-comments"))?n(JSON.parse(e)):(e=()=>{twikoo.getRecentComments({envId:"https://twikoo.tryrun.top/",region:"",pageSize:6,includeReply:!0}).then(function(e){e=e.map(e=>({content:t(e.comment),avatar:e.avatar,nick:e.nick,url:e.url+"#"+e.id,date:new Date(e.created).toISOString()}));saveToLocal.set("twikoo-newest-comments",JSON.stringify(e),10/1440),n(e)}).catch(function(e){document.querySelector("#card-newest-comments .aside-list").textContent="无法获取评论，请确认相关配置是否正确"})},"object"==typeof twikoo?e():getScript("https://cdn.cbd.int/twikoo@1.6.18/dist/twikoo.all.min.js").then(e)))};e(),document.addEventListener("pjax:complete",e)})</script><script async data-pjax src="https://npm.elemecdn.com/anzhiyu-theme-static@1.0.1/bubble/bubble.js"></script><script>var visitorMail="visitor@anheyu.com"</script><script async data-pjax src="https://cdn.cbd.int/anzhiyu-theme-static@1.0.0/waterfall/waterfall.js"></script><script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/qrcodejs/1.0.0/qrcode.min.js"></script><script src="/js/anzhiyu/right_click_menu.js"></script><link rel="stylesheet" href="https://cdn.cbd.int/anzhiyu-theme-static@1.1.9/icon/ali_iconfont_css.css"><script async src="/js/1.min.js?1"></script><script async src="/js/bg.js?1"></script><script async src="https://cdn1.tianli0.top/npm/sweetalert2@8.19.0/dist/sweetalert2.all.js"></script><script async src="/js/lunar.min.js?1"></script><script async src="/js/day.min.js?1"></script><script async src="/js/winbox.bundle.min.js?1"></script><script id="click-show-text" src="https://cdn.cbd.int/butterfly-extsrc@1.1.3/dist/click-show-text.min.js" data-mobile="true" data-text="富强,民主,文明,和谐,自由,平等,公正,法治,爱国,敬业,诚信,友善" data-fontsize="15px" data-random="true" async></script><link rel="stylesheet" href="https://cdn.cbd.int/anzhiyu-theme-static@1.0.0/aplayer/APlayer.min.css" media="print" onload='this.media="all"'><script src="https://cdn.cbd.int/anzhiyu-blog-static@1.0.1/js/APlayer.min.js"></script><script src="https://cdn.cbd.int/hexo-anzhiyu-music@1.0.1/assets/js/Meting2.min.js"></script><script src="https://cdn.cbd.int/pjax@0.2.8/pjax.min.js"></script><script>let pjaxSelectors=['meta[property="og:image"]','meta[property="og:title"]','meta[property="og:url"]','meta[property="og:type"]','meta[property="og:site_name"]','meta[property="og:description"]',"head > title","#config-diff","#body-wrap","#rightside-config-hide","#rightside-config-show",".js-pjax"];var pjax=new Pjax({elements:'a:not([target="_blank"])',selectors:pjaxSelectors,cacheBust:!1,analytics:!0,scrollRestoration:!1});document.addEventListener("pjax:send",function(){if(anzhiyu.removeGlobalFnEvent("pjax"),anzhiyu.removeGlobalFnEvent("themeChange"),document.getElementById("rightside").classList.remove("rightside-show"),window.aplayers)for(let e=0;e<window.aplayers.length;e++)window.aplayers[e].options.fixed||window.aplayers[e].destroy();"object"==typeof typed&&typed.destroy();var e=document.body.classList;e.contains("read-mode")&&e.remove("read-mode")}),document.addEventListener("pjax:complete",function(){window.refreshFn(),document.querySelectorAll("script[data-pjax]").forEach(e=>{const t=document.createElement("script");var a=e.text||e.textContent||e.innerHTML||"";Array.from(e.attributes).forEach(e=>t.setAttribute(e.name,e.value)),t.appendChild(document.createTextNode(a)),e.parentNode.replaceChild(t,e)}),GLOBAL_CONFIG.islazyload&&window.lazyLoadInstance.update(),"function"==typeof chatBtnFn&&chatBtnFn(),"function"==typeof panguInit&&panguInit(),"function"==typeof gtag&&gtag("config","G-3VMKW5TZBM",{page_path:window.location.pathname}),"object"==typeof _hmt&&_hmt.push(["_trackPageview",window.location.pathname]),"function"==typeof loadMeting&&document.getElementsByClassName("aplayer").length&&loadMeting(),"object"==typeof Prism&&Prism.highlightAll()}),document.addEventListener("pjax:error",e=>{404===e.request.status&&pjax.loadUrl("/404.html")})</script><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><script charset="UTF-8" src="https://cdn.cbd.int/anzhiyu-theme-static@1.1.5/accesskey/accesskey.js"></script></div><div id="popup-window"><div class="popup-window-title">通知</div><div class="popup-window-divider"></div><div class="popup-window-content"><div class="popup-tip">你好呀</div><div class="popup-link"><i class="anzhiyufont anzhiyu-icon-arrow-circle-right"></i></div></div></div></body></html>